簡體   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