在MatLab中修剪二进制矩阵

时间:2013-02-22 15:08:02

标签: 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

我希望修剪这个矩阵(换句话说,删除边界处的零)就像:

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

如何以“Matlab”的方式做到这一点? 不使用传统的循环和条件

要更清楚,矩阵应缩小为从第一列开始,该列至少有一个1,并以具有相同条件的最后一列结束。应删除此范围之外的任何列。相同的规则适用于行。

感谢。

3 个答案:

答案 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)