我正在乘以Matrix1[10][2] * Matrix2[2][20]
,但每次我的班级试图乘以时,总会抛出与上述标题相同的异常。但是当我将行数小于矩阵1中的列数和小于矩阵2上行数的列时,它会执行矩阵乘法而没有问题这是我的乘法类
public class MatrixCompute extends RecursiveAction
{
private CreateMatrix a,b;
private CreateMatrix c;
private int row;
MatrixCompute(CreateMatrix a , CreateMatrix b ,CreateMatrix c )
{
this(a , b ,c,-1);
}
MatrixCompute(CreateMatrix a, CreateMatrix b, CreateMatrix c, int row)
{
if (a.getCols() != b.getRow())
{
throw new IllegalArgumentException("rows/columns mismatch");
}
this.a = a;
this.b = b;
this.c = c;
this.row = row;
}
@Override
public void compute()
{
if (row == -1)
{
List<MatrixCompute> tasks = new ArrayList<>();
for (int row = 0; row < a.getRow(); row++)
{
tasks.add(new MatrixCompute(a, b, c, row));
}
invokeAll(tasks);
}
else
{
multiplyRowByColumn(a, b, c, row);
}
}
void multiplyRowByColumn(CreateMatrix a, CreateMatrix b, CreateMatrix c, int row) {
for (int j = 0; j < b.getCols(); j++) {
for (int k = 0; k < a.getCols(); k++) {
c.setValue(row, j, (int)(c.getValue(row, j) + a.getValue(row, k)* b.getValue(k, j)));
}
}
}
}
和包装矩阵的类:
public class CreateMatrix
{
private int[][] matrix;
public CreateMatrix (int row, int col )
{
matrix = new int[row][col];
}
public void fillMatrix()
{
for(int i = 0; i < matrix.length; i++)
{
for(int j = 0; j < matrix[i].length ;j++ )
{
Random r = new Random();
matrix[i][j] = r.nextInt() * 5;
}
}
}
public int getCols()
{
return matrix[0].length;
}
public int getRow()
{
return matrix.length;
}
int getValue(int row, int col)
{
return matrix[row][col];
}
void setValue(int row, int col, int value)
{
matrix[row][col] = value;
}
}
这是执行操作的语句:
result = new CreateMatrix(row, col);
ForkJoinPool pool = new ForkJoinPool();
pool.invoke(new MatrixCompute(container[0], container[1], result));
这里矩阵被贴上了十字架:
CreateMatrix matrix1 = new CreateMatrix(Integer.parseInt(txtfil.getText()), Integer.parseInt(txtcol.getText()));
container[0] = matrix1;
container[0].fillMatrix();
CreateMatrix matrix2 = new CreateMatrix(Integer.parseInt(txrow.getText()), Integer.parseInt(txtcol2.getText()));
container[1] = matrix2;
最后,矩阵结果的大小由txrow.getText()
和txtcol.getText()
所以,因为乘法矩阵的唯一例外必须是矩阵1上的列必须与Matrix2中的行相同,那么为什么在Matrix1的行和Matrix2的列中抛出最大值的异常
答案 0 :(得分:1)
首先,有点数学。我们知道A n,m * B m,p = C n,p 。这意味着对于C中第i列j行中的每个单元格,我们有:
所以要得到C,我们必须:
int[][] matrixA = new int[n][m];
int[][] matrixB = new int[m][p];
//You could check if the matrixes above can multiply, by throwing an
//exception if it does not.
int[][] matrixC = new int[n][p];
for ( int i = 0 ; i < n ; i++ ) {
for ( int j = 0 ; j < p ; j++ ) {
for ( int k = 0 ; k < m ; k++ ) {
matrixC[i][j] += matrixA[i][k]*matrixB[k][j];
}
}
}
编辑:你的代码抛出ArrayIndexOutOfBoundsException异常的原因,因为你试图在数组的边界旁边迭代,这意味着你试图访问,例如,在Matrix1 [10] [2]你试图读取Matrix1 [11] [3]上的值,它不存在。
你的代码有点令人困惑,所以我只是用一点数学来帮助你理解一种更好,更清洁,更简单的方法。
我希望我有所帮助。
度过愉快的一天。