私はMatrix1[10][2] * Matrix2[2][20]
を掛けていますが、私のクラスが乗算しようとするたびに、上記のタイトルと同じ例外が常にスローされます。しかし、私は行列2の行の数よりも少ない行列1の列と列の数よりも少ない行に入れたとき、それは問題なく行列の乗算を行い、これは乗算行列の乗算でのArrayArdeIndexOutOfBoundsException
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;
}
}
動作が実行されているなステートメントである:
マトリックスはdecalredている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;
最終的にマトリックス結果のサイズはマトリックス乗算に唯一の例外は、一つの行列2の行と同じでなければならない行列に列でなければならないので、そうtxrow.getText()
とtxtcol.getText()
で宣言され、なぜされ私はMatrix1の行とMatrix2の列の中で最大の値で例外を投げています
(CreateMatrix、CreateMatrixのB、CreateMatrix c)は { この(A、B、C、-1); } – xFighter
これは、行列の行にわたって反復を開始するための単なるフラグです。したがって、rowsが-1の場合は、行列全体を反復処理して、すべての行列の行のインデックスを取得します。 –
例外をポストします。 – talex