我编写了一个程序,它为两个矩阵提供随机值,然后使用乘法打印出第三个矩阵。矩阵1为3x3(行,列),矩阵2为(3x2)。
我的输出如下:
Matrix 1:
4 6 0
9 1 5
4 7 5
Matrix 2:
4 6
0 9
1 5
matrix 1 x matrix 2:
16 78 97059710
41 88 218384285
21 112 97059715
正如您所看到的,第三个矩阵给出了一个带有奇怪值的额外行/列。 (97057910
等。)
下面是我用C ++编写的乘法函数:
Matrix Matrix::multiply(Matrix one, Matrix two) {
int n1 = one.data[0].size();
int n2 = two.data.size();
int nCommon = one.data.size();
vector< vector<int> > temp(nCommon);
for ( int i = 0 ; i < nCommon ; i++ )
temp[i].resize(n2);
for(int i=0;i<n1;i++) {
for(int j=0;j<n2;j++) {
for(int k=0;k<nCommon;k++) {
temp[i][j]= temp[i][j] + one.data[i][k] * two.data[k][j];
}
}
}
const Matrix result = Matrix(temp);
return result;
}
有没有人对如何解决此问题有任何建议?我想删除那一行奇怪的值,只有两列。
答案 0 :(得分:0)
即使你的一个矩阵只有两列,看起来你的for循环仍然会尝试访问每一行第三列的值。
two.data[k][j]
k从0迭代到one.data.size()
- 1,或0..2。
j也从0迭代到two.data.size()
- 1,也是0..2。
但是,根据您的描述,two
矩阵的第二维范围仅为0..1。
未定义的行为。代码在向量的末尾运行,并且读取垃圾。
答案 1 :(得分:0)
您的行数和列数混淆了。想法是将A(I x K)乘以B(K x J),这是代码的作用:
int n1 = one.data[0].size(); // this is K
int n2 = two.data.size(); // this is also K
int nCommon = one.data.size(); // this is I
vector< vector<int> > temp(nCommon);
for ( int i = 0 ; i < nCommon ; i++ )
temp[i].resize(n2);
// temp is now I x K, which is not what was intended,
// and the iteration over rows and columns will not be correct.
请改为尝试:
int n1 = one.data.size(); // this is I
int n2 = two.data[0].size(); // this is J
int nCommon = two.data.size(); // this is K
vector< vector<int> > temp(n1);
for ( int i = 0 ; i < nCommon ; i++ )
temp[i].resize(n2);