2012-12-04 7 views
6

Ich habe eine N × M-Matrix bekam m wie:bekommen alle Untermatrizen

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

Ich möchte × Q alle Untermatrizen der Größe P erhalten (P, Q ungerade) w/o eine Verwendung für -Schleife. Das Ergebnis s sollte eine P × Q × ((N-P + 1) · (M-Q + 1)) Matrix sein.

z. wenn 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] 
+0

Warum gibt es Multiples? Z.B. '5 6 7' erscheint zweimal. – Jonas

+0

@Jonas Entschuldigung, mein Beispiel war verwirrend. Ist es jetzt einfacher zu verstehen? – kay

+0

Nein, ich verstehe immer noch nicht ganz: Warum sollten Sie doppelte Einträge haben wollen? Nur damit Sie Ihr Array auffüllen können? Haben Sie sich auch meine Lösung angesehen? – Jonas

Antwort

6

im2col können Sie sich hier helfen:

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 mit der 'sliding' Option findet alle überlappende Untermatrizen und gibt jeweils als (P · Q) -elementigen Spaltenvektor in columnized. Um diese wieder in Matrizen umzuwandeln, wird diese (P · Q) × ((N-P + 1) · (M-Q + 1)) Matrix in ein P × Q × ((N-P + 1) · (M-Q + 1)) eins.