返回一个2D向量

Returning a 2D vector

本文关键字:一个 2D 向量 返回      更新时间:2023-10-16

我正在写一个简单的c++程序来做两个矩阵的克罗内克张量积,就像matlab函数kron

程序如下:

#include<iostream>
#include<vector>
using namespace std;
vector< vector<double> > kron(vector< vector<double> > &A, vector< vector<double> > &B);
int main()
{

    vector< vector<double> > a = {{1,-2},{-1,0}}; // matrices a and b
    vector< vector<double> > b = {{4,-3},{2,3}};
    int m = a.size()*b.size();
    int n = a[0].size()*b[0].size();
    vector< vector<double> > T(m,vector<double>(n,0.0));
    T = kron(a,b);

    // Display the resulting matrix T
    for(int i  = 0; i < T.size(); i++)
    {
        for(int j = 0; j < T[0].size(); j++)
        {
            cout << T[i][j] << ",";
        }
        cout << endl;
    }

    return 0;
}
vector< vector<double> > kron(vector< vector<double> > &A, vector< vector<double> > &B)
{
    int krnProdRow = A.size()*B.size();
    int krnProdCol = A[0].size()*B[0].size();
    int nRowA = A.size();
    int nColA = A[0].size();
    int nRowB = B.size();
    int nColB = B[0].size();
    vector< vector<double> > krnProd(krnProdRow,vector<double>(krnProdCol,0.0));
    int i,j,k,l;
    for(i=0; i<nRowA; i++)
    {
        for(k=0; k<nRowB; k++)
        {
            for(j=0; j<nColA ; j++)
            {
                for(l=0; l<nColB; l++)
                {
                    krnProd[i+l+1][j+k+1] = A[i][j]*B[k][l];
                                //cout << krnProd[i+l+1][j+k+1] << ",";
                }
            }
            //cout << endl;;
        }
    }
    return krnProd;
}

当从函数返回矩阵krnProd并将其分配给主函数中的T矩阵时,我得到以下矩阵:

0, 0, 0, 0
0, 4, 2, -4
0, -4, -2, 0
0, 3, -3, 0

这是完全错误的。

然而,如果我在函数本身中打印出krnProd矩阵,我得到:

4, -3, -8, 6
2, 3, -4, -6
-4, 3, 0, 0
-2, -3, 0, 0

恰好是正确答案。我想知道,为什么当从函数返回矩阵时,我得到了不同的答案?我是不是忽略了什么?或者我返回2D矢量的方式是错误的?

您的矩阵由rowA*rowB行和colA*colB列表示。这是错误的。考虑到您如何访问元素(即使用i+l'j+k),它们应该是rowA+colBcolA+rowB

同时也访问了

的元素
krnProd[i+l+1][j+k+1]

,不清楚为什么要加1。我会做这些改变:

int krnProdRow = A.size() + B[0].size();
int krnProdCol = A[0].size() + B.size();

krnProd[i+l][j+k] = ...

你所做的调试打印并不是你所返回的矩阵,而是所有的计算值按照你计算它们的顺序。

将调试打印后的计算将显示您在main中获得的相同结果…c++完全支持返回向量的向量

在找到for循环的索引关系来做克罗内克张量积之后。从这道题中,我最终得到了for循环的索引关系来进行计算。由于这个问题,下面是解决方案:

vector< vector<double> > kron(vector< vector<double> > &A, vector< vector<double> > &B)
{
    size_t krnProdRow = A.size()*B.size();
    size_t krnProdCol = A[0].size()*B[0].size();
    size_t nRowA = A.size();
    size_t nColA = A[0].size();
    size_t nRowB = B.size();
    size_t nColB = B[0].size();
    vector< vector<double> > krnProd(krnProdRow,vector<double>(krnProdCol,0.0));
    size_t i,j,k,l;
    double valA =0.0;
    double valB = 0.0;
    // Looping for kronecker tensor products of A and B
    // Trace the index of the loops to understand the kronecker tensor product
    for(i = 0; i <nRowA ; i++)
    {
        for(j = 0; j < nColA; j++)
        {
            valA = A[i][j];
            for(k = 0; k < nRowB; k++)
            {
                for(l = 0; l < nColB; l++)
                {
                    valB = B[k][l];
                    krnProd[nRowB*i+k][nColB*j+l] = valA * valB;
                }
            }
        }
    }
    return krnProd;
}

再次感谢大家的时间。