如何获取2d数组(矩阵)的子数组

ttcibm8c  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(247)

我试图得到一个矩阵的子矩阵,但我对它背后的逻辑有困难。对于这样的矩阵:

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

这就是我在主语中所说的

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新手,所以我非常感谢您的帮助。

wr98u20j

wr98u20j1#

您应该将要复制的子矩阵的作用域传递给您的方法,即它的作用域 starting 以及 ending 关于 rows 以及 columns ,类似于:

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

通常,在需要在两个不同的数据结构上同时迭代的问题中,如果不是从相同的位置开始迭代,则更容易为每个结构使用不同的索引变量。在下面的代码中,我使用变量 i 以及 j 在矩阵上迭代 subM.data 以及变量 r 以及 c 在矩阵上迭代 A.data 那你就给我打电话 submatrix(A, 0, 2, 0, 3) . 输出为:

1 2 3 
4 5 6

我认为这是你真正想要的,但如果我错了,请纠正我。
顺便说一句,我假设一个行为良好的输入。通常,您需要对变量添加额外的检查 row_begin , row_end , col_begin , col_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;
    }

如果不想跳过行或列,只需将矩阵本身的大小作为range。在您的示例中,您希望跳过中间的列,以便调用 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

相关问题