0

以下是计算两个矩阵 A 和 B 之间的矩阵乘法的函数,该值将存储在矩阵 C 中。矩阵 B 中的行数与 A 中的列数相同。我假设有是此函数中的一个错误,因为在使用该函数时它似乎不会产生正确的输出,但是该错误可能在我程序的其他部分。

void matMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C){
   int i,j,k;
        for(i=0;i<ARows;i++){
        for(j=0;j<ACols;j++){
            int sum = 0;
            for(k=0;k<BCols;k++){
            sum += A[i][k]*B[k][j];
        }
        C[i][j] = sum;
        }
    }   
} 
4

3 回答 3

0

在评估乘法时,您sum=0所做的总和等于零,总和将仅包含矩阵第一行(例如 M1)的最后一个值和第二个矩阵列的最后一个值(例如 M2)的乘积。因此,每次正确时总和将是不正确的值:

void matMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C){
   int i,j,k, sum;
        for(i=0;i<ARows;i++){

        for(j=0;j<ACols;j++){
            for(k=0;k<BCols;k++){
            sum += A[i][k]*B[k][j];
        }
        C[i][j] = sum;
        sum = 0;
        }
    }   

}

于 2013-10-30T09:16:17.363 回答
0

功能应该是:

void matMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C){
  int i,j,k;
    for(i=0;i<ARows;i++){
    int sum = 0;
    for(j=0;j<ACols;j++){ 
        for(k=0;k<BCols;k++){
        sum += A[i][k]*B[k][j];
    }
    C[i][j] = sum;
    }
  }   
} 

在每次评估两个矩阵的行和列元素的乘积之前,总和必须重置为零。

于 2013-10-30T08:20:18.363 回答
0

我看到的一个是:

int sum = 0;应该至少在第一个for循环之外完成,因为它在外循环中使用。您的代码将在内循环的每次迭代中将其重置为 0。

或者更好的是,

void matMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C){
   int i,j,k, sum;
        for(i=0;i<ARows;i++){
        sum = 0;
        for(j=0;j<ACols;j++){
            for(k=0;k<BCols;k++){
            sum += A[i][k]*B[k][j];
        }
        C[i][j] = sum;
        }
    }   
} 
于 2013-10-30T08:16:49.860 回答