Java矩阵乘法实现问题:两层循环结果错误求排查
矩阵乘法两层循环实现问题排查
问题概述
尝试用Java实现仅使用两层循环的矩阵乘法方法,但输出结果不符合预期。已尝试交换循环变量i/j、替换data.length为numRows/numColumns,但问题仍未解决。
输入输出对比
输入矩阵1
{1, 2, 3}, {2, 5, 6}
输入矩阵2
{4, 5}, {3, 2}, {1, 1}
预期输出
{13, 12}, {29, 26}
实际输出
{5, 12, 3}, {8, 15, 6}
代码问题分析
当前times方法存在三个核心错误:
- 结果矩阵初始化错误:
用new Matrix(data)创建结果矩阵,会直接复制当前矩阵的所有数据,而非创建一个全0的新矩阵。后续计算时是在原矩阵值基础上累加,完全偏离矩阵乘法的初始要求。 - 结果矩阵维度错误:
矩阵乘法中,A(m行n列)× B(n行p列)的结果应为m行p列。但当前代码创建的结果矩阵维度和原矩阵一致,不符合规则。 - 循环逻辑与计算规则错误:
- 循环边界错误:内层循环使用
data.length(原矩阵行数),应改为参数矩阵的列数m.numColumns。 - 元素计算逻辑错误:原代码使用
m.data[i][j] * m2.data[j][i],完全不符合矩阵乘法C[i][j] = Σ(A[i][k] * B[k][j])的计算规则。
- 循环边界错误:内层循环使用
修正后的代码
public Matrix(int d[][]) { numRows = d.length; if (numRows == 0) numColumns = 0; else numColumns = d[0].length; data = new int[numRows][numColumns]; for (int i = 0; i < numRows; i++) for (int j = 0; j < numColumns; j++) data[i][j] = d[i][j]; } public Matrix times(Matrix m) throws IllegalArgumentException { Matrix m2 = this; if (m.numRows != m2.numColumns) throw new IllegalArgumentException("矩阵维度不匹配,无法执行乘法"); // 创建正确维度的全0结果矩阵 int[][] resultData = new int[m2.numRows][m.numColumns]; Matrix newArray = new Matrix(resultData); // 外层遍历结果行,内层遍历结果列,同时完成k维度的求和 for (int i = 0; i < m2.numRows; i++) { for (int j = 0; j < m.numColumns; j++) { int sum = 0; for (int k = 0; k < m2.numColumns; k++) { sum += m2.data[i][k] * m.data[k][j]; } newArray.data[i][j] = sum; } } return newArray; }
注:若严格要求仅两层循环,可以将k的求和逻辑通过数组预处理或其他方式整合,但常规矩阵乘法的计算逻辑本质需要三层循环来完成元素的累加求和,上述代码是符合数学规则的标准实现。
内容的提问来源于stack exchange,提问作者Preston Little
相关产品推荐
相关产品推荐

