返回一个2D向量
Returning a 2D vector
我正在写一个简单的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+colB
和colA+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;
}
再次感谢大家的时间。
相关文章:
- 一个 2D 数组,并按行存储值.第一个循环用于行索引,第二个循环用于列索引
- 填充另一个 2D 数组后,堆已损坏
- 如何编写一个简单的CGAL代码来隔离一个2D矩形
- C++将 2D 阵列的一部分复制到另一个 2D 阵列,性能
- 从给定的行和列中生成一个2D整数数组
- 尝试创建一个2D数组,其大小仅在C 中的运行时才知道
- 在C#和C++之间发送一个2D int数组
- C 设置构造器中的数组大小,复制一个2D数组
- 从QTScript操纵一个2D阵列
- Qt:如何制作一个2d插值颜色的字段
- 通过一个函数传递一个2D数组,我得到一个错误
- 无法从 2D 数组执行从 2D 数组到另一个 2D 数组的 strcpy
- 使用 STRCPY 将 2d 字符数组复制到另一个 2d 数组中
- 如何在c++中返回一个2d数组的指针
- 我想找到一个2d数组C++中每一行的最大值
- 将一个2d动态数组传递给C++中的一个函数
- 将一个2d数组指针传递给一个函数,并在函数内部分配内存
- 将多维数组随机化(随机播放)为另一个 2D 数组
- 想要移动一个2d对象而不是另一个
- 将一个2D数组分配给另一个