Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MatLab中的修剪二元矩阵_Matlab - Fatal编程技术网

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]