获取所有子矩阵

时间:2012-12-04 21:15:38

标签: matlab vectorization submatrix

我有一个N×M矩阵m,如:

 1  2  3  4
 5  6  7  8
 9 10 11 12
13 14 15 16

我希望得到大小为P×Q(P,Q为奇数)的所有子矩阵,而不使用for循环。

结果s应为P×Q×((N-P + 1)·(M-Q + 1))矩阵。

E.g。如果P = Q = 3:

s(:,:,1) = [1 2 3;  5  6  7;  9 10 11]
s(:,:,2) = [2 3 4;  6  7  8; 10 11 12]
s(:,:,3) = [5 6 7;  9 10 11; 13 14 15]
s(:,:,4) = [6 7 8; 10 11 12; 14 15 16]

1 个答案:

答案 0 :(得分:6)

im2col可以帮到你:

m =
     1     2     3     4
     5     6     7     8
     9    10    11    12
    13    14    15    16

>> P = 3; Q = 3;
>> columnized = im2col(m,[P Q],'sliding');
>> nMatrices = size(columnized,2);
>> s = reshape(columnized, [P Q nMatrices])

s(:,:,1) =
     1     2     3
     5     6     7
     9    10    11
s(:,:,2) =
     5     6     7
     9    10    11
    13    14    15
s(:,:,3) =
     2     3     4
     6     7     8
    10    11    12
s(:,:,4) =
     6     7     8
    10    11    12
    14    15    16
带有im2col选项的

'sliding'查找所有重叠的子矩阵,并将每个子矩阵作为{P·Q} - 元素列向量返回columnized。为了将这些转化为矩阵,我们reshape将此(P·Q)×((N-P + 1)·(M-Q + 1))矩阵转换为P×Q×((N-P +) 1)·(M-Q + 1))一。