繁体   English   中英

从 C 中的平方矩阵中获取子矩阵

[英]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

但是这个循环只给我左上角的子矩阵,而我想要右下角然后展开它,这样它就给了我初始矩阵的所有可能的子矩阵。

起初你在循环中的索引不正确! 您想要填充从索引0c的目标矩阵行和从索引0r的列,因此您的循环需要如下所示:

for(size_t i = 0; i < r; ++i)
{
    for(size_t j = 0; j < c; ++j)
    {
        // ...
    }
}

从这里开始,您现在可以简单地在索引ij处分配目标矩阵:

submatrix[i][j] = ...;

问题是这些索引与源矩阵中的索引不同(除非您想使用左上角的子矩阵),因此您需要将索引转换为源矩阵中的适当位置。 幸运的是,这并不困难; 如果源矩阵中子矩阵的左上角位于r0行和c0列,那么您只需将它们添加到相应的循环索引中,这样您就可以得到:

... = initial_matrix[r0 + i][c0 + j];

在你的情况下,这意味着例如[1 + i][1 + j]得到右下角的子矩阵,其中ij从 0 向上计数到排除的 2(即计数 0 和 1)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM