矩阵乘法中的java.lang.ArrayIndexOutOfBoundsException

时间:2016-10-27 14:12:20

标签: java matrix

我正在乘以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的列中抛出最大值的异常

1 个答案:

答案 0 :(得分: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 [11] [3]上的值,它不存在。

你的代码有点令人困惑,所以我只是用一点数学来帮助你理解一种更好,更清洁,更简单的方法。

我希望我有所帮助。

度过愉快的一天。