尝试查找2D阵列/矩阵的行列式时ArrayIndexOutOfBoundsException

时间:2016-05-06 17:35:22

标签: java matrix runtime-error indexoutofboundsexception determinants

这是我的第一篇Stack Overflow帖子,我对java还不熟悉,所以我最初可能无法理解你给我的一些反馈。

通过这个程序,我应该以用户确定的大小递归地找到矩阵的行列式。但是,当我这样做时,我收到了这个错误:

  

线程中的异常" main" java.lang.ArrayIndexOutOfBoundsException:1

at Determinant.Copy<Determinant.java:55>
at Determinant.det<Determinant.java:31>
at Determinant.main<Determinant.java:15>

我理解这个错误意味着什么,但我不明白为什么会发生这种错误。

以下是我正在使用的类(printmatrix和main方法都是由我的老师编写的,我必须完成Copy和det方法):

import javax.swing.JOptionPane;

public class Determinant
{
    public static void main(String args[])
    {
    String sizeStr = JOptionPane.showInputDialog("What size?");
    int size = Integer.parseInt(sizeStr);
    int[][] matrix = new int[size][size];
    for(int i=0; i<size; i++)
        for(int j=0; j<size; j++)
            matrix[i][j] = (int)(Math.random()*40)-20;

    printArray(matrix);
    System.out.println("\nThe determinant = "+det(matrix));

    }


public static int det(int[][] A)
{
    int answer = 0;
    int place = 0;
    int[][] temp;
    int[][] temp1;
    if(A.length==1){
        return(A[0][0]);
    }
    for(int i = 0; i<A.length; i++){
        temp = new int[A.length-1][A[0].length-1];
        temp1 = Copy(temp, i);
        if(i%2==0){
            place = 1;
        }
        else{
            place = -1;
        }
        answer = answer + place * A[0][i] * det(temp1);
    }
    return answer;
}



public static int[][] Copy(int[][] B, int i)
{
    int[][] C = new int[B.length-1][B.length-1];

    for(int j = 1; j<B.length; j++){
        for(int k = 0; k<B[0].length; k++){
            if(k>i){
                C[j-1][k-1]=B[j][k];
            }
            else{
                C[j-1][k]=B[j][k];
            }
        }
    }
    return C;
}


public static void printArray(int[][] A)
{
    for(int i=0; i<A.length; i++)
    {
        for(int j=0; j<A.length; j++)
        {
            int num = A[i][j];
            if(num<-9)
                System.out.print(" ");
            else if(num<0||num>9)
                System.out.print("  ");
            else
                System.out.print("   ");
            System.out.print(A[i][j]);
        }
        System.out.println();
    }
}


}

错误发生在Copy和temp1 = Copy(temp, i)中的else语句中。

我很困惑,好像j或k = 1,不应该是阵列中的位置?我错过了什么?

2 个答案:

答案 0 :(得分:0)

方法副本中C数组的大小应与B数组相同。    原因:您正在将B数组复制到C数组中,它们应该具有相同的大小。    请尝试以下方法:

import javax.swing.JOptionPane;

public class Determinant
{
  public static void main(String args[])
  {
    String sizeStr = JOptionPane.showInputDialog("What size?");
    int size = Integer.parseInt(sizeStr);
    int[][] matrix = new int[size][size];

    for(int i=0; i<size; i++) {
        for(int j=0; j<size; j++) {
            matrix[i][j] = (int) (Math.random() * 40) - 20;
        }
    }

    printArray(matrix);
    System.out.println("\nThe determinant = "+det(matrix));

  }


public static int det(int[][] A)
{
    int answer = 0;
    int place = 0;
    int[][] temp;
    int[][] temp1;
    if(A.length==1){
        return(A[0][0]);
    }
    for(int i = 0; i<A.length; i++){
        temp = new int[A.length-1][A[0].length-1];
        temp1 = Copy(temp, i);
        if(i%2==0){
            place = 1;
        }
        else{
            place = -1;
        }
        answer = answer + place * A[0][i] * det(temp1);
    }
    return answer;
  }



public static int[][] Copy(int[][] B, int i)
{
    //The C array size should be same as B
    int[][] C = new int[B.length][B[0].length];

    for(int j = 1; j<B.length; j++){
        for(int k = 0; k<B[0].length; k++){
            if(k>i){
                C[j-1][k-1]=B[j][k];
            }
            else{
                C[j-1][k]=B[j][k];
            }
        }
    }
    return C;
}


public static void printArray(int[][] A)
{
    for(int i=0; i<A.length; i++)
    {
        for(int j=0; j<A.length; j++)
        {
            int num = A[i][j];
            if(num<-9)
                System.out.print(" ");
            else if(num<0||num>9)
                System.out.print("  ");
            else
                System.out.print("   ");
            System.out.print(A[i][j]);
        }
        System.out.println();
    }
}

}

希望这能解释,享受!

答案 1 :(得分:0)

您应该以这种方式在复制功能中声明矩阵:

int[][] C = new int[B.length][B[0].length];

否则,您将声明一个没有行和列的矩阵。你从0开始使用的事实并不意味着你应该在less中声明一行!