2012-12-04 14 views
6

Mam jak N x macierzy M m jak:uzyskanie wszystkich podmatryce

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

że chce się wszystkie podmatryce rozmiaru p x P (P, Q są nieparzyste) W/O z zastosowaniem for -pętla.

Wynik s powinien być macierzą P × Q × ((N-P + 1) · (M-Q + 1)).

E.g. jeżeli 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

Dlaczego są wielokrotności? Na przykład. '5 6 7' pojawia się dwukrotnie. – Jonas

+0

@ Jonas przepraszam, mój przykład był mylący. Czy teraz jest łatwiej zrozumieć? – kay

+0

Nie, nadal nie do końca rozumiem: dlaczego chcesz mieć zduplikowane wpisy? Tylko po to, żeby wypełnić tablicę? A także, czy spojrzałeś na moje rozwiązanie? – Jonas

Odpowiedz

6

im2col może pomóc tutaj:

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 z opcją 'sliding' wyszukuje wszystkie nakładające podmatryc i zwraca każdy jako (P · P) -elementowe wektor kolumnowy w columnized. Aby przekształcić je z powrotem w matryce, mamy reshape tę macierz (P · Q) × ((N-P + 1) · (M-Q + 1)) na P × Q × ((N-P + 1) · (M-Q + 1)) jeden.