You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言计算矩阵列平均值得到错误值的问题求助

问题成因
  1. 平均值计算逻辑颠倒
    你需要计算每一列的平均值,但现有代码实际计算的是每一行的平均值。从你给出的输出就能验证:输出的第一个平均值-531.000000正好是第一行所有元素求和后除以5的结果,第二个-59.000000是第二行的平均,以此类推,完全符合行平均的计算结果。
  2. 读入逻辑存在冗余风险
    fscanf读取%lf格式时会自动跳过所有空白符(空格、制表符、换行符),你在读完每行元素后额外读取换行符的代码没有必要,反而可能在行列数不匹配时导致数据读入错位。
  3. 行数统计函数存在边界缺陷
    你当前使用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:15:03