在C语言中进行矩阵乘法 - 结果矩阵中的错误值

3

我使用C语言编写了传统的矩阵乘法,但是结果不正确,虽然我没有看到任何明显的错误。我的输入文件如下:

3 2

2 2

2 2

2 2

2 3

1 1 1

1 1 1

第一行和第五行中的3 2和2 3表示后续矩阵中的行数和列数。结果应该是一个3x3的矩阵,全部为4。然而,这段代码返回:

4197299 4 4

4 4 4

-1912599044 32621 572

我倾向于认为这可能是我声明矩阵的方式有问题所致。我没有使用malloc,而是从输入文件中扫描行和列的值并直接实例化所需的矩阵。我对C语言非常陌生,因此动态内存分配的概念还不完全清晰。我可能完全错了,但我不确定。特别让我困惑的是,大约一半的矩阵返回了正确的值。以下是我的代码。

#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;
}

首先,永远不要使用任何 scanf 的衍生版本(除了 sscanf,但只有在您100%确定输入格式正确时才能使用)。http://www.gidnetwork.com/b-59.html - hl037_
@hl037_:胡说八道!只要你了解它的缺陷和行为,就没有问题。 - too honest for this site
在这种情况下,我确信输入格式正确。@hl037_ - Sara
我建议在你认为问题可能出现的地方使用printf()语句,并检查输出是否符合预期。现在这就足够了。以后你可以学习使用类似GNU调试器(gdb)的调试工具。 - Kishore
在编译时,“row1 col1 row2 col2”尚未初始化,因此它们具有不确定的值。这些不确定的值是您用来初始化矩阵的值,因为它们被声明时就已经在编译时创建了。也许在这种特殊情况下这不是问题,因为在编译后它们最终变成零,但这并不保证。 - perencia
3个回答

3
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
      }
    }
}

2

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

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


1

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


它不一定在C11中适用,但似乎这不是问题的原因。 - Davislor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接