2012-07-10 19 views
8

Sto cercando una soluzione elegante a questo problema molto semplice in MATLAB. Supponiamo di avere una matriceMATLAB: estrae la sottomatrice con l'indicizzazione logica

>> 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 

e una variabile logica del modulo

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 

Se si tenta di recuperare gli elementi di M associate 1 valori I, ho un vettore colonna

>> M(I) 

ans = 

    5 
    6 
    7 
    13 

Quale sarebbe il modo più semplice per ottenere la matrice [5 7 ; 6 13] da questa indicizzazione logica?

Se conosco la forma degli elementi diversi da zero di I, è possibile utilizzare una risagoma dopo l'indicizzazione, ma non è un caso generale.

Inoltre, sono a conoscenza del fatto che il comportamento predefinito per questo tipo di indicizzazione in MATLAB aumenta la coerenza rispetto al caso in cui i valori diversi da zero in I non formano una matrice, ma mi chiedo se esiste un semplice soluzione per questo caso particolare.

risposta

11

Questo è un modo per farlo. Si presume che tutte le righe di I abbiano lo stesso numero di quelle. Si presume inoltre che tutte le colonne di I abbiano lo stesso numero, poiché Submatrix deve essere rettangolare.

%# 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

Ecco una soluzione molto semplice:

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

Proprio quello che stavo per rispondere :-) –

+0

che non funziona allways, per esempio quando non è simmetrico. – rst

+0

@RobertStettler Se intendi che la matrice 'I' non può essere creata a caso, è vero, ma guardando la domanda penso che sia una ragionevole limitazione. Se intendi qualcos'altro: non vedo come la simmetria sia rilevante qui, potresti forse presentare un esempio in cui la soluzione fallisce? (Matrice di input, uscita, uscita prevista). –