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

Processing(Java)矩阵乘法报错:ArrayIndexOutOfBoundsException排查修复

搞定你的矩阵乘法Bug & 后续优化建议

嘿,我一眼就揪出你代码里的问题了,咱们一步步来解决!

问题根源分析

首先你的构造方法完全没问题,不用怀疑它。问题全出在Matrix_Multipication方法里,有两个核心错误:

1. 结果矩阵的尺寸搞反了

矩阵乘法的规则是:如果A是m×n矩阵,B是n×p矩阵,结果C必须是m×p。但你现在创建结果矩阵时写的是:

Matrix c = new Matrix(b.cols, rows);

这直接把行和列搞反了!比如你的测试用例里,m1是2×3,m2是3×1,结果应该是2×1矩阵,但你创建了一个1×2的矩阵,后续循环肯定越界。

2. 三重循环的索引逻辑完全混乱

你循环里的i、j对应了错误的维度,导致访问数组时超出了边界。正确的循环逻辑应该是:

  • 遍历结果矩阵的行:对应原矩阵A的行(范围是0到rows-1)
  • 遍历结果矩阵的列:对应矩阵B的列(范围是0到b.cols-1)
  • 累加的维度是A的列/B的行(范围是0到cols-1)

修复后的乘法代码

把Matrix_Multipication改成这样:

Matrix matrixMultiplication(Matrix b) {
    // 先校验矩阵维度是否合法,不合法直接抛出异常(比返回空矩阵更直观)
    if (cols != b.rows) {
        throw new IllegalArgumentException("矩阵A的列数必须等于矩阵B的行数!当前A是" + rows + "×" + cols + ",B是" + b.rows + "×" + b.cols);
    }
    
    // 创建正确尺寸的结果矩阵:A的行 × B的列
    Matrix c = new Matrix(rows, b.cols);
    
    // 三重循环计算矩阵乘积
    for (int i = 0; i < rows; i++) {          // 结果矩阵的行(对应A的行)
        for (int j = 0; j < b.cols; j++) {    // 结果矩阵的列(对应B的列)
            double sum = 0;
            for (int k = 0; k < cols; k++) {  // 累加维度(A的列/B的行)
                sum += matrix[i][k] * b.matrix[k][j];
            }
            c.matrix[i][j] = sum;
        }
    }
    return c;
}

测试代码验证

现在运行你的测试代码:

Matrix m1 = new Matrix(2,3);
Matrix m2 = new Matrix(3,1);
Matrix m3 = m1.matrixMultiplication(m2); // 注意方法名改成小驼峰符合Java规范

不会再触发数组越界错误了,你可以给m1和m2赋值具体数值,验证计算结果是否正确。

适用的矩阵库推荐

如果你不想自己造轮子,可以用这些成熟的库:

  • JAMA:Java经典的基础矩阵库,支持基本的矩阵运算、求逆、特征值等。安装方法:下载JAMA的jar包,放到Processing安装目录下的libraries文件夹里,重启Processing后就能导入使用。
  • Apache Commons Math:功能更全面的数学库,除了矩阵运算还有统计、优化等功能。安装方式和JAMA一样,下载jar放到libraries目录即可。
  • The Coding Train的Matrix类:你参考的教程里的实现是经过验证的,直接照搬他的代码就行,适配Processing的使用场景,而且代码简洁易懂。

代码&问题描述的改进方向

  • 代码规范:Java方法名用小驼峰命名,比如Matrix_Multipication改成matrixMultiplication,可读性更好。
  • 错误处理:维度不匹配时不要返回空矩阵,抛出IllegalArgumentException并带上清晰的错误信息,方便调试。
  • 变量命名:循环变量用更直观的名字,比如rowA、colB、k,代替i、j、k,别人看代码时一眼就能明白对应哪个维度。
  • 问题描述优化:下次提问时可以附上完整的错误堆栈信息(比如具体是哪一行代码抛出的异常),以及给测试矩阵赋具体数值,方便别人复现和验证结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:32:41