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
}
}
}
所以我用 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
}
}
}