C 中的矩阵乘法 - 结果矩阵中的错误值

Matrix multiplication in C - error values in result matrix

所以我用 C 编写了传统的矩阵乘法(我是 C 的初学者),但由于某种原因我的结果不正确,尽管我没有看到任何明显的错误。我的输入文件如下所示:

3 2

2 2

2 2

2 2

2 3

1 1 1

1 1 1

第一行和第五行的3 2 和2 3 表示后面矩阵的行数和列数。结果应该是一个 3x3 矩阵,全是 4。但是,这段代码 returns

4197299 4 4

4 4 4

-1912599044 32621 572

我倾向于认为这可能是由于我声明矩阵的方式所致。我没有使用 malloc,而是扫描了输入文件中的行值和列值,并直接实例化了所需的矩阵。我是 C 的新手,所以动态内存分配的概念还不是 100% 清楚。我可能完全偏离了标准,但我不确定。让我特别困惑的是大约一半的矩阵返回了正确的值。为什么会这样?下面是我的代码。

#include<stdio.h>
#include<stdlib.h>


int main(int argc, char** argv){
  int i, j, k, row1, col1, row2, col2, temp;
  if(argc != 2){
    printf("error\n");
    exit(1);
  }

  FILE *file = fopen(argv[1], "r");
  if(file == NULL){
    printf("error\n");
    exit(1);
  }
  //MATRIX 1
  fscanf(file, " %d\t%d", &row1, &col1);
  int matrix1[row1][col1];

  for(i = 0; i<row1; i++){
    for(j=0; j<col1; j++){
      fscanf(file, "%d", &temp);
      matrix1[i][j] = temp;
    }
  }
  //MATRIX TWO
  fscanf(file, " %d\t%d", &row2, &col2);
  int matrix2[row2][col2];
  int product[row1][col2]; //DECLARING PRODUCT MATRIX
  for(i = 0; i<row2; i++){
    for(j=0; j<col2; j++){
      fscanf(file, "%d", &temp);
      matrix2[i][j] = temp;
    }
  }  
  
  for(i = 0; i<row1; i++){
    for(j = 0; j<col2; j++){
      for(k = 0; k<col1; k++){
    product[i][j] += matrix1[i][k]*matrix2[k][j]; //MULTIPLICATION STEP
      }
    }
  }

  for(i = 0; i<row1; i++){
    for(j = 0; j<col2; j++){
      printf("%d\t", product[i][j]); //PRINTING THE PRODUCT
    }
    printf("\n");
  }
  
  return 0;
}

您没有初始化 product,这意味着它的内容是 不确定的,然后在计算中使用它(例如 +=)会导致未定义的行为

您需要先将 products 矩阵初始化为全零。

是的,这种声明动态数组的方式不一定有效,在C99之前或之后的任何版本中,尽管导致问题的原因是您没有初始化product。尝试 calloc( row1*col2, sizeof(int) ); 这会分配所有元素并将它们初始化为 0。

for(i = 0; i<row1; i++){
    for(j = 0; j<col2; j++){
      product[i][j] = 0; // should be zero before summing
      for(k = 0; k<col1; k++){
          product[i][j] += matrix1[i][k]*matrix2[k][j]; //MULTIPLICATION STEP
      }
    }
}