【问题标题】:Array index of bound exception error while traversing a 3* 3 submatrix within a large 7*7 matrix遍历大型 7*7 矩阵中的 3*3 子矩阵时绑定异常错误的数组索引
【发布时间】:2019-08-31 06:34:35
【问题描述】:

我想从中间元素(第 2 行,第 2 列)的 (1,1) 开始在一个大的 7*7 矩阵起始位置遍历一个 3*3 子矩阵。 位置 (1,1) 对应的子矩阵将是

                [(0,1),(0,2),(0,3)]
                [(1,1),(1,2),(1,3)]
                [(2,1),(2,2),(2,3)]

像这样的遍历将继续.. 下一个子矩阵的起始位置将是 (1,2)

                 [(0,2),(0,3),(0,4)]
                 [(1,2),(1,3),(1,4)]
                 [(2,2),(2,3),(2,4)]

我的代码

static int i;
static int j;
static int g;
static int h;

static void submatrix(int p,int q,int[][] mat) {

System.out.print("Submatrix for : ");
System.out.println(p+","+q);
shiftmatrix(p,q,mat);
}

static void shiftmatrix(int p,int q,int[][] mat) {
 int m,n;
 int[][] d = new int[3][3];
 for( m=0;m<3;m++) {
  for( n=0;n<3;n++) {
   p=m+(p-1);
   q=n+q;
   d[m][n]=mat[p][q];
     }
   }

System.out.println("Your 3*3 SubMatrix is : ");
    for ( m = 0; m < 3; m++){
    for ( n = 0; n < 3; n++){
        System.out.print(d[m][n]+"\t");
        }
         System.out.println();
        }
}
public static void main(String[] args) {

    int[][] a = new int[7][7];
    int[][] mat = new int[7][7];
    for ( i = 0; i < 7; i++)
      {
       for ( j = 0; j < 7; j++){
          Random rand = new Random();
           a[i][j] = rand.nextInt(10);
          }
      }

//copying large matrix to another for passing by argument 

 System.out.println("Copied matrix is : ");
 for (i = 0; i < 7; i++){
     for (j = 0; j < 7; j++){
          mat[g][h]=a[i][j];
            System.out.print(mat[g][h]+"\t");
        }
          System.out.println();
    }

//Here is the 3*3 submatrix traversing starts...

 for (i=1;i<6;i++) {
   for (j=1;j<5;j++) {
    int p=i;
     int q=j;
     submatrix(p,q,mat);
     }
  }
}
}

运行此代码时出现错误

ArrayIndexOutOfBoundsException: -1 

请帮忙

【问题讨论】:

标签: java arrays matrix


【解决方案1】:

您代码中的IndexOutOfBoundsException 来自您调用p = m + (p - 1)。您不需要在循环的每次迭代中更改 pq 变量。

此外,你有几个不必要的变量,其中一些是静态的,当你只在这样的循环中使用它们时应该避免这种情况。在清理了代码的格式并删除了所有不必要的变量后,我相信代码可以按照您的意愿运行。

代码会忽略随机矩阵的第一行和第一列。这是期望的行为吗?

import java.util.Random;

public class MatrixTest {

    public static void subMatrix(int startRow, int startCol, int[][] mat) {

        System.out.print("Submatrix for : ");
        System.out.println(startRow + ", " + startCol);
        shiftMatrix(startRow, startCol, mat);
    }

    public static void shiftMatrix(int startRow, int startCol, int[][] mat) {
        int[][] d = new int[3][3];
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                //to properly move within the 3x3 you only need to add a 
                //constant buffer to the indices of mat[][]
                d[i][j] = mat[i + startRow][j + startCol]; 
            }
        }
        System.out.println("Your 3*3 SubMatrix is : ");
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print(d[i][j] + "\t");
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {

        int[][] mat = new int[7][7];
        for (int i = 0; i < 7; i++) {
            for (int j = 0; j < 7; j++){
                Random rand = new Random();
                mat[i][j] = rand.nextInt(10);
            }
        }

        //copying large matrix to another for passing by argument 

        System.out.println("Copied matrix is : ");
        for (int i = 0; i < 7; i++){
            for (int j = 0; j < 7; j++) {
                System.out.print(mat[i][j] + "\t");
            }
            System.out.println();
        }
        //Here is the 3*3 submatrix traversing starts...

        for (int i = 1; i < 5; i++) { //changed from i < 6 to i < 5 to stay inside 7x7
            for (int j = 1; j < 5; j++) {
                subMatrix(i, j, mat);
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2018-10-27
    相关资源
    最近更新 更多