6

我有一个像这样的二进制矩阵:

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,并在具有相同条件的最后一列结束,包括在内。应删除此范围之外的任何列。相同的规则适用于行。

谢谢。

4

3 回答 3

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))
于 2013-02-22T15:21:55.993 回答
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 
于 2015-01-06T10:41:47.267 回答
0

find您可以使用可以返回行和列索引的事实:

[r1, c1] = find(x, 1, 'first')
[r2, c2] = find(x, 1, 'last')
x(r1:r2, c1:c2)
于 2013-02-22T15:35:17.323 回答