本文详解 java 中二维数组矩阵乘法的算法逻辑、标准实现及常见错误规避,提供可直接运行的完整代码与关键注意事项。
本文详解 java 中二维数组矩阵乘法的算法逻辑、标准实现及常见错误规避,提供可直接运行的完整代码与关键注意事项。
矩阵乘法是线性代数中的基础运算,在 Java 中需严格遵循数学定义:若矩阵 A 为 m×n,矩阵 B 为 n×p,则其乘积 C = A × B 为 m×p 矩阵,且元素满足:
$$ C[i][j] = \sum_{k=0}^{n-1} A[i][k] \times B[k][j] $$
这意味着结果矩阵第 i 行第 j 列的值,等于 A 的第 i 行与 B 的第 j 列对应元素乘积之和。原代码错误在于混淆了索引逻辑——它试图用单层嵌套模拟点积,却未分离“行遍历”“列遍历”与“内积求和”三层结构,导致仅计算了对角线位置(如 r[0][0]),其余位置因未初始化或索引越界而保留默认值 0.0,从而输出 {{6,0,0},{0,6,0},{0,0,6}}。
以下是符合规范的 Java 实现:
public double[][] producto(double[][] m1, double[][] m2) {
// 参数校验:确保矩阵维度兼容(m1 列数 == m2 行数)
if (m1 == null || m2 == null || m1.length == 0 || m2.length == 0
|| m1[0].length != m2.length) {
throw new IllegalArgumentException("Invalid matrix dimensions for multiplication: "
+ "m1 columns (" + (m1.length > 0 ? m1[0].length : 0)
+ ") must equal m2 rows (" + m2.length + ")");
}
int rows1 = m1.length; // 结果矩阵行数
int cols1 = m1[0].length; // m1 列数(即 m2 行数)
int cols2 = m2[0].length; // 结果矩阵列数
double[][] result = new double[rows1][cols2];
// 三层循环:外层遍历结果矩阵的每一行(i)
for (int i = 0; i < rows1; i++) {
// 中层遍历结果矩阵的每一列(j)
for (int j = 0; j < cols2; j++) {
// 内层计算点积:累加 m1[i][k] * m2[k][j](k 从 0 到 cols1-1)
for (int k = 0; k < cols1; k++) {
result[i][j] += m1[i][k] * m2[k][j];
}
}
}
return result;
}✅ 关键要点说明:
立即学习“Java免费学习笔记(深入)”;
- 索引命名清晰化:使用 i(行)、j(列)、k(求和下标)替代模糊的 fila/col1/col2,大幅提升可读性与逻辑正确性;
- 维度检查必不可少:矩阵乘法要求左矩阵列数等于右矩阵行数,缺失校验将导致 ArrayIndexOutOfBoundsException 或静默错误;
- 结果数组尺寸正确:new double[rows1][cols2],而非原文中错误的 new double[m1.length][m1[0].length](这会生成方阵,不适用于非方阵乘法);
- 无需显式初始化为 0:double 数组默认值为 0.0,但显式赋值 result[i][j] = 0 可增强意图表达(代码中已省略,属安全优化)。
? 测试验证:
输入 m1 = {{1,1,1},{1,1,1},{1,1,1}} 与 m2 = {{2,2,2},{2,2,2},{2,2,2}},每行([1,1,1])与每列([2,2,2])点积均为 1×2 + 1×2 + 1×2 = 6,故输出为 {{6,6,6},{6,6,6},{6,6,6}},完全符合预期。
掌握此三重循环模式,即可稳健扩展至任意兼容维度的矩阵乘法,是构建数值计算、图形变换或机器学习基础模块的重要一步。


















