矩阵乘法结果矩阵中的C - 错误值
问题描述:
因此,我编码传统矩阵乘法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;
}
答
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
答
你不初始化product
,这意味着它的内容是不确定,那么在计算中使用它(例如与+=
)导致未定义行为。
您需要首先将products
矩阵初始化为全零。
首先,永远不要使用任何'scanf'derivative(除'sscanf'但只有当你是* 100%确定*输入格式正确)http://www.gidnetwork.com/b-59.html –
@ hl037_:废话!如果你知道它的陷阱和行为,没有问题。 – Olaf
在这种情况下,我确定输入格式正确。 @ hl037_ – Sara