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