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
相关产品推荐
相关产品推荐

