返回二维向量

Posted

技术标签:

【中文标题】返回二维向量【英文标题】:Returning a 2D vector 【发布时间】:2015-08-12 16:55:27 【问题描述】:

我正在编写一个简单的 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 并将其分配给我的主函数中的 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

这恰好是真正的答案。我想知道,为什么从函数返回矩阵时会得到不同的答案?我在这里忽略了什么吗?或者我的方式是错误的?

【问题讨论】:

像你一样返回向量我看不出有什么问题。 如果你在函数内显示的是你的注释代码,你不会以相同的顺序显示。 但是你应该在打印结果时使用for(int j = 0; j &lt; T[i].size(); j++)。否则,您总是参考第一行。 i, jj, i 时,您将结果覆盖为i+l+1 nmmain 中不是必需的。 T 可以简单地初始化为 vector&lt; vector&lt;double&gt; &gt; T = kron(a,b);。更好的是,设为 const,在 C++11 中,考虑 auto: auto const T = kron(a,b); 【参考方案1】:

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

【讨论】:

感谢您的帮助。我现在明白这个错误了。关于 SUM,两个矩阵之间的克罗内克张量积,比如大小为 m x n 的 A 和大小为 p x q 的 B 将返回一个结果更大的矩阵 C,大小为 mp x nq。 @tarmizi: 考虑m=n=p=q=1的极限情况...你希望结果是2×2还是1×1(mp×nq) 不是正确的公式。另请注意,您正在使用i+lj+k(添加索引或行/列)访问结果矩阵,这意味着矩阵的行数和列数应该是总和...... 谢谢,那是一个错误。我相信我已经解决了这个问题。我把它贴在下面。 =)【参考方案2】:

在寻找 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;

再次感谢大家的宝贵时间。

【讨论】:

以上是关于返回二维向量的主要内容,如果未能解决你的问题,请参考以下文章

返回二维向量

返回二维向量的结束索引

检查二维向量中的邻居周围坐标时返回的值不正确

C++ 如何制作二维向量函数?

分段错误:从二维向量中随机删除元素

在 C++ 中重塑二维向量