2013-02-22 18 views
5

ho una matrice binaria come questo:Trim Binary Matrix in MatLab

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

e voglio tagliare questa matrice (in altre parole, togliere gli zeri ai confini) di essere come:

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

Come fare in questo modo "Matlab"? quello è non utilizzare i cicli convenzionali e le condizioni.

Per essere più chiari, la matrice deve essere ridotta a partire dalla prima colonna che presenta almeno un 1, e termina con l'ultima colonna con la stessa condizione, inclusiva. Qualsiasi colonna fuori da questo intervallo dovrebbe essere rimossa. Le stesse regole si applicano alle righe.

Grazie.

+0

La vostra matrice di ingresso hanno sempre un confine di '0's o vuoi solo per rifilare i bordi che sono tutti '0's? –

+0

solo i bordi che sono tutti '0's –

+1

Duplicato di http://stackoverflow.com/questions/5488504/matlab-remove-leading-and-trailing-zeros-from-a-vector – Junuxx

risposta

9

Se hai i dati nella matrice M ...

x = find(any(M,2),1,'first'):find(any(M,2),1,'last'); 
y = find(any(M),1,'first'):find(any(M),1,'last'); 
M(x, y) 

Oppure, se si sa che ci sarà un 1 in ogni riga/COL, tranne i bordi:

M(any(M,2), any(M)) 
+0

Funziona come previsto se c'è una riga/colonna con tutti gli zeri nel mezzo? – Junuxx

+0

Questo approccio avrà problemi se la matrice ha colonna o riga zero aggiuntiva nel centro della matrice –

+0

@Junuxx Buona cattura. L'ho visto io stesso e l'ho risolto proprio come hai commentato. – shoelzer

0

È potrebbe utilizzare il fatto che find può tornare riga e colonna indici:

[r1, c1] = find(x, 1, 'first') 
[r2, c2] = find(x, 1, 'last') 
x(r1:r2, c1:c2) 
+0

Questo non funzionerà perché' find' tratta 'x' come un array lineare e quindi converte in indici row/col. Si rompe su una matrice come '[1 0 0; 1 1 0; 1 0 0] '. – shoelzer

+0

Hai ragione. In tal caso non funzionerà. – Vandhunden

0

estensione a hi Gher dimensioni:

Assumendo una matrice 3D per essere tagliato, questo è più semplice:

M=rand(3,3,3); % generating a random 3D matrix 
M(2,:,:)=0; % just to make a check if it works in extreme case of having zeros in the   middle 

padded = padarray(M,[2 2 2]); % making some zero boundaries 

[r,c,v]=ind2sub(size(padded),find(padded)); 

recoveredM=padded(min(r):max(r),min(c):max(c),min(v):max(v)); 

check=M==recoveredM % checking to see if M is successfully recovered