2016-10-27 8 views
0

私は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の列の中で最大の値で例外を投げています

+0

(CreateMatrix、CreateMatrixのB、CreateMatrix c)は { この(A、B、C、-1); } – xFighter

+0

これは、行列の行にわたって反復を開始するための単なるフラグです。したがって、rowsが-1の場合は、行列全体を反復処理して、すべての行列の行のインデックスを取得します。 –

+0

例外をポストします。 – talex

答えて

1

まず、我々は、A n、m * B m、p = C n、pを知っている。

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]; 
     } 
    } 
} 

EDIT::だから

Cell Value

は、我々が持っているCを得るために:どのはCの行のi列jの各セルのために、私たちは持っているということの理由は、あなたのコードがスローされますArrayIndexOutOfBoundsException例外は、配列の境界の横に反復処理を試みているためです。つまり、Matrix1 [10] [2]の値を読み取ろうとしているMatrix1 [10] [2] ]、それは存在しません。

あなたのコードはちょっと混乱しています。だから、より良い、よりクリーンでシンプルな方法を理解するのに役立つ少しの数学を入れます。

私は助けてくれることを願っています。

よろしくお願いいたします。

あなたが実際にあなたのMatrixComputeクラスのコンストラクタMatrixComputeでこれをやっていること
+0

この質問は、行列の乗算と例外処理の詳細についてはあまり見えません。あなたのコードはうまくいくかもしれませんが、作業中にOPが別のArrayIndexOutOfBoundsExceptionを実行した場合、OPは彼が始めたのと同じ質問に戻ります。 –

+1

この例外は、配列の境界の横にある繰り返しを試みるときにスローされます。彼のコードは混乱しているので、アルゴリズム実装のためだと言います。私は少しの数学でそれを単純化しました。 –

+0

それはいいです。今あなたの答えにそれを編集する必要がありますか?私はOPが例外のコンセプトをまだ理解していないと感じています。「この行列を乗算する唯一の例外はMatrix2の列と同じでなければなりません。 " –