2013-02-22 22 views
5

içinde böyle bir ikili matris vardır:Trim İkili Matrix 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 

ve ben gibi olmak (başka bir deyişle sınırlarında sıfır kaldırmak) bu matrisi kırpmak istiyorum:

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

"Matlab" yolu nasıl yapılır? , geleneksel döngüler ve koşullar kullanılmamalıdır.

net olmak gerekirse, matris en az bir 1 sahiptir ve kapsayıcı aynı durumda, son sütun biter, ilk kolondan başlatmak için azaltılmalıdır. Bu aralığın dışındaki herhangi bir sütun kaldırılmalıdır. Aynı kurallar satırlar için de geçerlidir.

Teşekkürler.

+0

girişinizi matrisi hep 0's 'bir sınır varsa veya sadece kenarları kırpın olmak mı istersiniz Hepsi 0'? –

+0

sadece hepsi 0 '' –

+1

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

cevap

9

Eğer matrisin M verileriniz varsa ...

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) 

Veya, kenarları hariç/col her satırda bir 1 olacağını biliyorsanız:

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

Bu, tüm sıfırlar ile ortada bir satır/sütun varsa, bu amaçlandığı gibi çalışır mı? – Junuxx

+0

Bu yaklaşım, matrisin –

+0

@Junuxx iyi yakalama merkezinde ek sıfır sütun veya satır varsa sorun olacaktır. Bunu kendim gördüm ve yorumladığınız gibi düzeltdim. Herhangi bir çözüm için – shoelzer

0

You

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

Bu işe yaramaz çünkü '' ' Bir lineer dizi olarak ve sonra satır/col endekslerine dönüştürür. Bu bir matrisin üzerine kırılıyor [1 0 0; 1 1 0; 1 0 0]. – shoelzer

+0

Haklısınız. Bu durumda işe yaramaz. – Vandhunden

0

Uzatma hi için: find satır ve sütun indeksleri dönebilirsiniz gerçeğini kullanabilirsiniz Gher boyutlar:

kesileceği bir 3D matris varsayıldığında, bu daha açıktır:

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