我试图得到一个矩阵的子矩阵,但我对它背后的逻辑有困难。对于这样的矩阵:
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新手,所以我非常感谢您的帮助。
1条答案
按热度按时间wr98u20j1#
您应该将要复制的子矩阵的作用域传递给您的方法,即它的作用域
starting
以及ending
关于rows
以及columns
,类似于:通常,在需要在两个不同的数据结构上同时迭代的问题中,如果不是从相同的位置开始迭代,则更容易为每个结构使用不同的索引变量。在下面的代码中,我使用变量
i
以及j
在矩阵上迭代subM.data
以及变量r
以及c
在矩阵上迭代A.data
那你就给我打电话submatrix(A, 0, 2, 0, 3)
. 输出为:我认为这是你真正想要的,但如果我错了,请纠正我。
顺便说一句,我假设一个行为良好的输入。通常,您需要对变量添加额外的检查
row_begin
,row_end
,col_begin
,col_end
以确保您不会遇到麻烦(例如。,IndexOutofbounds
).如果你真的想跳过中间的行和列,那么事情就变得更复杂了。一种解决方案是将要跳过的列/行的范围作为参数传递,例如:
如果不想跳过行或列,只需将矩阵本身的大小作为range。在您的示例中,您希望跳过中间的列,以便调用
submatrix
方法如下:这将输出: