我正在编写一个简单的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矢量的方式是错误的?
答案 0 :(得分:2)
您的矩阵的大小为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 ++完全支持返回向量向量。
答案 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;
}
再次感谢大家的时间。