2016-10-27 96 views
0

我正在乘以Matrix1[10][2] * Matrix2[2][20],但每當我的類嘗試乘法時,總是會拋出與上述標題相同的異常。但是當我把行小於在矩陣1和列小於上矩陣兩行的列數,它執行沒有問題的矩陣乘法,這是我的乘法矩陣乘法中的java.lang.ArrayIndexOutOfBoundsException

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

這裏是正在執行該操作的statment:

result = new CreateMatrix(row, col); 
        ForkJoinPool pool = new ForkJoinPool(); 
        pool.invoke(new MatrixCompute(container[0], container[1], result)); 

和這裏的矩陣被decalred其中:

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()

宣佈如此以來,在乘以矩陣必須是矩陣的列,唯一的例外之一必須是一樣矩陣2行,爲什麼在Matrix1的行和Matrix2的列中拋出我最大的值異常

+0

你在MatrixCompute類的構造函數MatrixCompute(CreateMatrix a,CreateMatrix b,CreateMatrix c)中實際做了什麼? {(a,b,c,-1); } – xFighter

+0

這只是一個開始迭代矩陣行的標誌,所以當行等於-1時,開始遍歷矩陣以獲取每個矩陣的行索引 –

+0

Post exception。 – talex

回答

1

首先,有點數學。我們知道A n,m * B m,p = C n,p。這意味着,在C中的第i行第j列的每個單元格,我們有:

Cell Value

所以才能獲取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 [10] [2],您嘗試讀取Matrix1上的值[11] [3 ],它不存在。

你的代碼有點令人困惑,所以我只是放了一些數學來幫助你理解更好,更清潔和更簡單的方法。

我希望我能幫上忙。

祝您有愉快的一天。

+0

這個問題似乎不是關於乘法矩陣和更多關於處理異常的問題。你的代碼可能沒問題,但是如果OP在處理時遇到另一個ArrayIndexOutOfBoundsException異常,他會回到他開始的同樣的問題。 –

+1

當他嘗試迭代數組邊界時拋出異常。由於他的代碼很混亂,我會說這是因爲它的算法實現。我只是用一些數學來簡化它。 –

+0

這很好。現在,也許你應該編輯你的答案?我有一種感覺,OP並不完全理解異常的概念,但是基於這一行:「因爲乘法矩陣的唯一例外必須是矩陣上的列,所以必須與Matrix2中的行相同...... 「 –