MatLab中的修剪二元矩阵
我有这样一个二进制矩阵:MatLab中的修剪二元矩阵,matlab,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的第一列开始缩减,并在具有相同条件的最后一列结束(包括)。任何超出此范围的列都应删除。同样的规则也适用于行 谢
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
的第一列开始缩减,并在具有相同条件的最后一列结束(包括)。任何超出此范围的列都应删除。同样的规则也适用于行
谢谢。如果您有矩阵
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))
您可以使用
find
可以返回行和列索引的事实:
[r1, c1] = find(x, 1, 'first')
[r2, c2] = find(x, 1, 'last')
x(r1:r2, c1:c2)
扩展到更高的维度: 假设要修剪三维矩阵,这更简单:
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
你的输入矩阵总是有一个
0
s的边界,还是你只想修剪所有0
s的边?只有所有0
s的边是@Junuxx的两个副本,这是一个二维矩阵,所以它不是一个精确的副本。@shoelzer:你只需要将答案应用到两个轴上。是的,有一个区别,但是它很小。如果在中间有一个全列的行/列,这是不是故意的?如果矩阵在中心有附加的零列或行,这个方法将有问题。matrix@Junuxx抢手货我自己看到了这一点,并按照您的评论修复了它。any
解决方案+1。如果这个假设成立的话,它是相当优雅的。但我仍然认为这个问题是重复的:pNice。好消息是它也可以作为匿名函数编写:trim_mat=@(M)M(find(any(M,2),1,'first'):find(any(M,2),1,'last'),find(any(M),1,'first'):find(any(M),1,'last')
这不起作用,因为find
将x
视为线性数组,然后转换为行/列索引。它在一个矩阵上断开,如[1 0;1 10;1 0 0]
。