You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java二维数组矩阵乘法实现问题:输出结果不符合预期

修正Java矩阵乘法代码的问题

你的代码存在两个核心错误:

  1. 结果矩阵维度定义错误
    矩阵乘法规则:若矩阵m1是n×k,m2是k×p,结果矩阵应为n×p。你当前代码里结果矩阵的列数用了m1[0].length,这不符合规则,应该改为m2[0].length。

  2. 循环逻辑完全错误
    你把行索引fila、m1的列索引col1、结果矩阵的列索引col绑定同步自增,这导致只计算了结果矩阵的对角线元素(fila=col的位置),其他列完全没处理,所以输出只有对角线有值。正确的矩阵乘法需要三层嵌套循环,分别处理结果的行、列,以及累加的维度。

修正后的代码

public double[][] producto(double[][] m1, double[][] m2) {
    // 先校验矩阵乘法的合法性:m1的列数必须等于m2的行数
    if (m1[0].length != m2.length) {
        throw new IllegalArgumentException("矩阵无法相乘:m1的列数不等于m2的行数");
    }
    
    // 结果矩阵的行数是m1的行数,列数是m2的列数
    double[][] r = new double[m1.length][m2[0].length];
    
    // 第一层循环:遍历结果矩阵的每一行(对应m1的行)
    for (int fila = 0; fila < m1.length; fila++) {
        // 第二层循环:遍历结果矩阵的每一列(对应m2的列)
        for (int col = 0; col < m2[0].length; col++) {
            // 第三层循环:遍历累加维度,计算乘积和
            for (int k = 0; k < m1[0].length; k++) {
                r[fila][col] += m1[fila][k] * m2[k][col];
            }
        }
    }
    return r;
}

代码说明

  • 增加了合法性校验:防止传入无法相乘的矩阵(比如m1列数和m2行数不相等的情况)。
  • 三层循环分工明确:
    • 外层fila循环:处理结果矩阵的每一行,对应取m1的第fila行。
    • 中层col循环:处理结果矩阵的每一列,对应取m2的第col列。
    • 内层k循环:遍历m1的列和m2的行,计算对应元素的乘积并累加到结果矩阵的r[fila][col]位置。

验证你的测试用例

输入m1 = {{1,1,1},{1,1,1},{1,1,1}}(3×3),m2 = {{2,2,2},{2,2,2},{2,2,2}}(3×3),修正后的代码会输出预期的{{6,6,6},{6,6,6},{6,6,6}},因为每个位置的计算都是1*2 + 1*2 +1*2 =6。

内容的提问来源于stack exchange,提问作者CDAMXI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:52:23