您应该将要复制的子矩阵的范围传递给您的方法,即其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;
}
如果您不想跳过行或列,只需将矩阵本身的大小作为范围。在您的示例中,您想跳过中间列,您可以调用 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