【问题标题】:How to get sub-array of 2d array (matrix)如何获取二维数组(矩阵)的子数组
【发布时间】:2020-11-25 07:47:35
【问题描述】:

我正在尝试获取矩阵的子矩阵,但我很难理解其背后的逻辑。对于这样的矩阵:

1 2 3 
4 5 6
7 8 9

我需要能够得到子矩阵(A, 3, 2):

1 3 
4 6 

这是我迄今为止尝试过的

    public Matrix submatrix(Matrix A, int i, int j) {
    Matrix subM = new Matrix(this.rows + 1, this.columns + 1);
    for (int r = i; r < this.rows; r++) {
        for (int c = j; c < this.columns; c++) {
            subM.data[r - i][c - j] = A.data[r][c];
        }
    }
    return subM;
}

这就是我试图在 main 中调用它的方式

Matrix A = new Matrix(new double[][]{{1, 2, 3},{4, 5, 6},{7, 8, 9}});
    int i = 3;
    int j = 2;
    Matrix m = A.submatrix(A, i, j);
    System.out.println("L:\n" + m);

我是 java 新手,所以我很感激任何帮助。

【问题讨论】:

    标签: java arrays matrix


    【解决方案1】:

    您应该将要复制的子矩阵的范围传递给您的方法,即其startingending 位置,两者都与rowscolumns 有关,类似于:

    public Matrix submatrix(Matrix A, int row_begin, int row_end, int col_begin, int col_end) {
        Matrix subM = new Matrix(row_end - row_begin, col_end - col_begin);
        for (int r = row_begin, i=0; r < row_end; r++, i++)
            for (int c = col_begin, j= 0; c < col_end; c++, j++)
                subM.data[i][j] = A.data[r][c];
        return subM;
    }
    

    通常,在需要同时迭代两个不同数据结构的问题中,而不是从相同位置开始迭代,为每个结构使用不同的索引变量会更容易。在下面的代码中,我使用变量ij 迭代矩阵subM.data,变量rc 迭代矩阵A.data

    然后你会打电话给submatrix(A, 0, 2, 0, 3)。输出将是:

    1 2 3 
    4 5 6
    

    我认为这是您真正想要的,但如果我错了,请纠正我。

    顺便说一句我假设输入行为良好。通常,您需要对变量 row_beginrow_endcol_begincol_end 添加额外检查,以确保您不会遇到麻烦(例如, IndexOutofbounds) .

    现在,如果您真的希望能够跳过中间的行和列,那么事情会变得更加复杂。一种解决方案是将要跳过的列/行的范围也作为参数传递,例如:

         int[][] submatrix(int [][] data, int row_begin, int row_end,
                                        int skip_row_begin, int skip_row_end,
                                        int col_begin, int col_end,
                                        int skip_col_begin, int skip_col_end) {
            int number_rows = row_end - row_begin - (skip_row_end - skip_row_begin);
            int number_cols = col_end - col_begin - (skip_col_end - skip_col_begin);
            int [][] subM = new int[number_rows] [number_cols];
            for (int r = row_begin, i=0; r < row_end; r++) {
                if(r < skip_row_begin || r >= skip_row_end) {
                    for (int c = col_begin, j = 0; c < col_end; c++) {
                         if(c < skip_col_begin || c >= skip_col_end) {
                             subM[i][j] = data[r][c];
                             j++;
                         }
                    }
                    i++;
                }
            }
            return subM;
        }
    

    如果您不想跳过行或列,只需将矩阵本身的大小作为范围。在您的示例中,您想跳过中间列,您可以调用 submatrix 方法,如下所示:

    int [][] submatrix(data, 0 , 2, data.length, data.length, 0 , 3, 1, 2);
    
    for (int[] ints : a) {
      for (int anInt : ints) 
         System.out.print(anInt + " ");
      System.out.println("\n");
    }
    

    这将输出:

    1 3 
    4 6 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 2021-07-10
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多