我有一个像这样的二进制矩阵:
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
我希望修剪这个矩阵(换句话说,删除边界处的零)就像:
0 0 1 0
1 0 0 0
0 1 0 1
0 0 1 0
如何以“Matlab”的方式做到这一点? 不使用传统的循环和条件。
要更清楚,矩阵应缩小为从第一列开始,该列至少有一个1
,并以具有相同条件的最后一列结束。应删除此范围之外的任何列。相同的规则适用于行。
感谢。
答案 0 :(得分:9)
如果您有矩阵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)
或者,如果您知道除了边缘之外每行/列中都会有1:
M(any(M,2), any(M))
答案 1 :(得分:1)
扩展到更高维度:
假设要修剪一个3D矩阵,这更直接:
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
答案 2 :(得分:0)
您可以使用find
可以返回行索引和列索引的事实:
[r1, c1] = find(x, 1, 'first')
[r2, c2] = find(x, 1, 'last')
x(r1:r2, c1:c2)