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

C语言矩阵乘法函数输出结果错误,请求问题排查

问题分析与修复

你的代码核心问题是矩阵元素的索引计算错误,这直接导致了结果异常。

错误原因

矩阵采用行优先存储时,访问第i行第k列的元素,偏移量应该是i * 列数 + k,而非i * 行数 + k。你在两个矩阵的元素访问上都犯了这个错误:

  • 矩阵a的元素访问:错误使用i*a.rows +k,正确应为i*a.cols +k
  • 矩阵b的元素访问:错误使用k*b.rows +j,正确应为k*b.cols +j

修复后的完整代码

#include <stdio.h>

typedef struct {
    int rows;
    int cols;
    double *data;
} matrix;

void mult(matrix a, matrix b){
    int m = a.rows;
    int n = b.cols;
    // 新增合法性检查:矩阵相乘要求a的列数等于b的行数
    if (a.cols != b.rows) {
        printf("矩阵无法相乘:a的列数不等于b的行数\n");
        return;
    }
    for(int i = 0; i < m; i++){
        for (int j = 0; j < n; j++)
        { 
          double c = 0;            
          for (int k = 0; k < a.cols; k++)
            {
                // 修正索引计算逻辑
                c += *(a.data + i*a.cols + k) * *(b.data + k*b.cols + j);
            }
            printf("%lf ", c);
              
        }
        puts("");
        
    }
}

int main(){
    matrix a;
    a.rows = 4;
    a.cols = 2;
    double data[] = {1,2, 
                     3,4,
                     5,6,
                     7,8
                    };
    a.data = data;
    matrix b;
    b.rows = 2;
    b.cols = 3;
    double data2[] = {3,2,1,
                      5,6,7
                     };
    b.data = data2;
    mult(a,b);
}

修复后的输出

运行修正后的代码,会得到正确的矩阵乘积结果:

13.000000 14.000000 15.000000 
29.000000 30.000000 31.000000 
45.000000 46.000000 47.000000 
61.000000 62.000000 63.000000 

额外建议:新增的合法性检查能避免传入不符合乘法规则的矩阵,提升代码健壮性。

内容的提问来源于stack exchange,提问作者soph6626

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:20:28