2015-09-27 238 views
3

因此,我编码传统矩阵乘法C(我是一个初学者C),但由于某种原因,我的结果是不正确的,虽然我没有看到任何眩光错误。我的输入文件看起来像:矩阵乘法结果矩阵中的C - 错误值

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

-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; 
} 
+0

首先,永远不要使用任何'scanf'derivative(除'sscanf'但只有当你是* 100%确定*输入格式正确)http://www.gidnetwork.com/b-59.html –

+0

@ hl037_:废话!如果你知道它的陷阱和行为,没有问题。 – Olaf

+0

在这种情况下,我确定输入格式正确。 @ hl037_ – Sara

回答

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 
     } 
    } 
} 
+0

谢谢,有道理。 – Sara

2

你不初始化product,这意味着它的内容是不确定,那么在计算中使用它(例如与+=)导致未定义行为

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

1

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

+0

它在C99或C11中工作:https://en.wikipedia.org/wiki/Variable-length_array – Garogolun

+0

它不一定在C11中工作,但这似乎并不是问题在这里。 – Davislor