返回2D矢量

时间:2015-08-12 16:55:28

标签: c++ function matrix vector return

我正在编写一个简单的C ++程序来执行两个矩阵的kronecker张量积,如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并将其分配给main函数中的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矢量的方式是错误的?

2 个答案:

答案 0 :(得分:2)

您的矩阵的大小为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 ++完全支持返回向量向量。

答案 1 :(得分:0)

在找到for循环的索引关系来解决kronecker张量积之后,我开始解决问题。我终于得到了for循环的索引关系来从this问题进行计算。多亏了这个问题,以下是解决方案:

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;
}

再次感谢大家的时间。