矩阵乘法w /随机值输出错误

时间:2015-06-23 10:54:46

标签: c++ matrix multiplying

我编写了一个程序,它为两个矩阵提供随机值,然后使用乘法打印出第三个矩阵。矩阵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;
}

有没有人对如何解决此问题有任何建议?我想删除那一行奇怪的值,只有两列。

2 个答案:

答案 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);