C语言计算矩阵列平均值得到错误值的问题求助
问题成因
- 平均值计算逻辑颠倒
你需要计算每一列的平均值,但现有代码实际计算的是每一行的平均值。从你给出的输出就能验证:输出的第一个平均值-531.000000正好是第一行所有元素求和后除以5的结果,第二个-59.000000是第二行的平均,以此类推,完全符合行平均的计算结果。 - 读入逻辑存在冗余风险
fscanf读取%lf格式时会自动跳过所有空白符(空格、制表符、换行符),你在读完每行元素后额外读取换行符的代码没有必要,反而可能在行列数不匹配时导致数据读入错位。 - 行数统计函数存在边界缺陷
你当前使用的numOfLines仅统计换行符数量,若文件最后一行数据末尾没有换行符会少统计一行,若文件末尾存在多余空行则会多统计行数,最终导致分配的矩阵大小和实际数据不符,读入垃圾值参与计算。
修复方案
1. 修正平均值计算逻辑
列平均的计算逻辑为:按列遍历,累加每一行同列的数值,再除以总行数。你需要将平均值的数组索引从行号改为列号,调整循环顺序:
// 计算列平均,假设你的矩阵列数为5 #define COL_NUM 5 double* Averages = (double*)calloc(COL_NUM, sizeof(double)); // 外层循环遍历列,内层循环遍历行 for (j = 0; j < COL_NUM; j++) { for (i = 0; i < Msize; i++) { Averages[j] += Matrix2[i][j]; } Averages[j] /= Msize; }
2. 优化矩阵读入逻辑
删除多余的换行符读取代码,同时将内存分配、读入、打印的列遍历边界改为实际列数,避免行列数不一致导致的错误:
// 分配内存时按实际列数分配 for (int i = 0; i < Msize; i++) Matrix2[i] = (double*)calloc(COL_NUM, sizeof(double)); // 读入数据 for (i = 0; i < Msize; i++) { for (j = 0; j < COL_NUM; j++) { fscanf(Matrixfile, "%lf", &Matrix2[i][j]); } } // 打印矩阵 for (i = 0; i < Msize; i++) { for (j = 0; j < COL_NUM; j++) { printf("%lf\t", Matrix2[i][j]); } printf("\n"); } // 打印列平均值 printf("\n\nAverages:\n"); for (j = 0; j < COL_NUM; j++) printf("%lf\t", Averages[j]);
3. 可选:优化行数统计逻辑
可以调整numOfLines的实现,避免边界错误:
int numOfLines(FILE* Matrixfile) { int c, count = 0; int last_is_newline = 1; for (;; ) { c = fgetc(Matrixfile); if (c == EOF) break; if (c == '\n') { ++count; last_is_newline = 1; } else { last_is_newline = 0; } } // 最后一行没有换行符的情况补计数 if (!last_is_newline) count++; rewind(Matrixfile); return count; }
内容的提问来源于stack exchange,提问作者Draconian
相关产品推荐
相关产品推荐

