C++运算符重载实现矩阵乘法时最内层k循环列数取值问题
矩阵乘法运算符重载问题修复说明
矩阵乘法的核心规则为:当A矩阵维度为M行N列、B矩阵维度为N行P列时,二者可相乘,得到的结果矩阵维度为M行P列,计算单个元素时需要累加N次A对应行和B对应列的元素乘积,累加次数等于A的列数(也等于B的行数)。
你的代码存在三个需要修正的点:
- 缺失维度合法性校验
运算符重载函数执行前需要先判断当前矩阵的列数和传入矩阵的行数是否相等,不匹配时直接返回或抛出异常,避免内存访问越界。 - 结果矩阵初始化尺寸错误
原代码中Matrix mult(rows, cols);使用当前矩阵的列数作为结果矩阵的列数,不符合乘法规则,应改为Matrix mult(rows, dx.cols);,使用传入矩阵的列数作为结果矩阵的列数。 - 两层循环的遍历上限设置错误
中层j循环遍历的是结果矩阵的列,上限应为dx.cols,原代码使用cols会导致结果矩阵维度错误;内层k循环的遍历上限就是当前矩阵的列数cols(也可写为dx.rows,合法匹配场景下二者值完全相等)
修正后的完整代码如下:
Matrix Matrix::operator*(Matrix dx) { // 维度合法性校验 if (cols != dx.rows) { throw "矩阵维度不匹配,无法执行乘法运算"; } // 初始化正确维度的结果矩阵 Matrix mult(rows, dx.cols); for (int i = 0; i < rows; i++) { // j遍历上限改为传入矩阵的列数 for (int j = 0; j < dx.cols; j++) { mult.cx[i][j] = 0; // 修正k的遍历上限 for (int k = 0; k < cols; k++) { mult.cx[i][j] += cx[i][k] * dx.cx[k][j]; } } } mult.print(); return mult; } // 调用示例,无需提前初始化结果对象,运算符重载会返回构造完成的矩阵 Matrix mult = mat1 * mat2;
另外注意原代码中operator*函数的闭合大括号缺失,且调用代码错误放置在了函数内部,需要调整位置。
内容的提问来源于stack exchange,提问作者ChuyMuy
相关产品推荐
相关产品推荐

