2012-07-10 17 views
8

Poszukuję eleganckiego rozwiązania tego bardzo prostego problemu w MATLAB. Załóżmy, że mam matrycęMATLAB: wyodrębnij submatrix z logicznym indeksowaniem

>> M = magic(5) 

M = 

    17 24  1  8 15 
    23  5  7 14 16 
    4  6 13 20 22 
    10 12 19 21  3 
    11 18 25  2  9 

i logiczną zmienną postaci

I = 

    0  0  0  0  0 
    0  1  1  0  0 
    0  1  1  0  0 
    0  0  0  0  0 
    0  0  0  0  0 

Gdy próbuję odzyskać elementy M związane do 1 wartości w I, mam wektor kolumnowy

>> M(I) 

ans = 

    5 
    6 
    7 
    13 

Jaki byłby najprostszy sposób uzyskania macierzy [5 7 ; 6 13] z tego indeksowania logicznego?

Jeśli znam kształt niezerowych elementów I, mogę użyć zmiany kształtu po indeksowaniu, ale nie jest to przypadek ogólny.

Ponadto zdaję sobie sprawę, że domyślne zachowanie dla tego typu indeksowania w MATLAB wymusza spójność w odniesieniu do przypadku, w którym niezerowe wartości w I nie tworzą macierzy, ale zastanawiam się, czy istnieje prosty rozwiązanie dla tego konkretnego przypadku.

Odpowiedz

11

Jest to jeden sposób, aby to zrobić. Zakłada się, że wszystkie wiersze I mają taką samą liczbę. Zakłada się również, że wszystkie kolumny I mają taką samą liczbę, ponieważ Submatrix muszą być prostokątne.

%# Define the example data. 

M = magic(5); 
I = zeros(5); 
I(2:3, 2:3) = 1; 

%# Create the Submatrix. 

Submatrix = reshape(M(find(I)), max(sum(I)), max(sum(I'))); 
2
M = magic(5); 
I = [ ... ]; 

ind = find(I); %# find indices of ones in I 
[y1, x1] = ind2sub(size(M), ind(1)); %# get top-left position 
[y2, x2] = ind2sub(size(M), ind(end)); %# get bottom-right position 
O = M(y1:y2, x1:x2); %# copy submatrix 
3

Tutaj jest bardzo proste rozwiązanie:

T = I(any(I'),any(I)); 
T(:) = M(I); 
+0

Tylko to, co miałem zamiar odpowiedzieć :-) –

+0

To nie działa zawsze dobrze, na przykład gdy nie są symetryczne. – rst

+0

@RobertStettler Jeśli masz na myśli matrycę "Ja" nie można zrobić losowo, to prawda, ale patrząc na pytanie uważam, że jest to rozsądne ograniczenie. Jeśli masz na myśli coś innego: nie rozumiem, w jaki sposób symetria jest tutaj istotna, czy mógłbyś przedstawić przykład, w którym rozwiązanie się nie udaje? (Macierz wejściowa, wyjście, oczekiwane wyjście). –