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
相关产品推荐
相关产品推荐

