[英]Obtaining a submatrix from a squared matrix in C
我想找到一种方法从 c 中的初始较大平方矩阵获取子矩阵,更具体地说,是右下角的子矩阵。 然后我想要 for 循环给我所有我可以从原始平方矩阵获得的子矩阵。
我在网上找到了一些代码:
int initial_matrix[3][3]
int submatrix[2][2];
for( int i = 0; i < R - r + 1; i++){
for(int j = 0; j < C - c + 1; j++){
submatrix[i][j]=initial_matrix[i][j]
}
}
在哪里:
R
是初始矩阵的行数(所以在这种情况下R=3
)C
是初始矩阵的列数(所以在这种情况下C=3
)r
是我想要获得的子矩阵的行数(所以在这种情况下r=2
)c
是我想要获得的子矩阵的列数(所以在这种情况下c=2
)但是这个循环只给我左上角的子矩阵,而我想要右下角然后展开它,这样它就给了我初始矩阵的所有可能的子矩阵。
起初你在循环中的索引不正确! 您想要填充从索引0
到c
的目标矩阵行和从索引0
到r
的列,因此您的循环需要如下所示:
for(size_t i = 0; i < r; ++i)
{
for(size_t j = 0; j < c; ++j)
{
// ...
}
}
从这里开始,您现在可以简单地在索引i
和j
处分配目标矩阵:
submatrix[i][j] = ...;
问题是这些索引与源矩阵中的索引不同(除非您想使用左上角的子矩阵),因此您需要将索引转换为源矩阵中的适当位置。 幸运的是,这并不困难; 如果源矩阵中子矩阵的左上角位于r0
行和c0
列,那么您只需将它们添加到相应的循环索引中,这样您就可以得到:
... = initial_matrix[r0 + i][c0 + j];
在你的情况下,这意味着例如[1 + i][1 + j]
得到右下角的子矩阵,其中i
和j
从 0 向上计数到排除的 2(即计数 0 和 1)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.