C++矩阵类重载*=运算符实现矩阵乘法结果全0且列数错误问题
问题定位
- 矩阵乘法逻辑完全错误:标准矩阵乘法的
C[i][j]是sum(A[i][r] * B[r][j]),你当前的代码直接对原矩阵的mat[i][r]做*=运算,既没有累加操作,也没有存储到正确的(i,j)下标位置,同时直接修改原矩阵元素会导致后续计算用到被篡改的错误值,这是运算结果全为0的核心原因。 - 循环边界错误:第二层循环当前限制为
j < rows(即当前矩阵的行数),正确的边界应该是j < m.cols(右操作数矩阵的列数),这是结果矩阵列数不符合预期的直接原因。 - 未更新矩阵元信息:矩阵乘法完成后,当前矩阵的列数需要修改为右操作数
m的列数,你没有对cols成员变量做赋值修改,也没有提前分配对应大小的存储空间存储结果。 - 没有使用临时缓存:矩阵乘法不能直接在原矩阵的内存上做计算,原矩阵的元素需要全程参与所有位置的运算,必须先创建临时矩阵存储计算结果,全部计算完成后再替换原矩阵的内容和元信息。
- 可选优化点:参数用值传递会产生不必要的矩阵拷贝,建议改为
const Matrice& m常量引用传递。
修正后的参考代码
void Matrice::operator*=(const Matrice& m) { if (cols != m.rows) { // 可选:此处可添加维度不匹配的异常抛出或错误提示逻辑 return; } // 创建临时矩阵存储结果,维度为 当前矩阵行数 * 右操作数列数,假设你的构造函数会自动初始化元素为0 Matrice res(rows, m.cols); for (int i = 0; i < res.rows; i++) { for (int j = 0; j < res.cols; j++) { for (int r = 0; r < cols; r++) { res.mat[i][j] += mat[i][r] * m.mat[r][j]; } } } // 计算完成后替换当前对象的内容,要求你的Matrice类已正确实现拷贝赋值运算符 *this = res; // 若未实现拷贝赋值,可手动替换:释放原有mat内存、复制res的mat数据、更新rows和cols的值即可 }
内容的提问来源于stack exchange,提问作者Michael Aldeni
相关产品推荐
相关产品推荐

