6

私は次のようなN×M行列を持っていますm

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

forループを使用せずにサイズP×Q(P、Qは奇数)のすべての部分行列を取得したいと思います。

結果sは、P×Q×((N-P + 1)・(M-Q + 1))行列になります。

たとえば、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]
4

1 に答える 1

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)) 1。

于 2012-12-05T05:19:09.973 に答える