【问题标题】:Trim Binary Matrix in MatLab在 MatLab 中修剪二进制矩阵
【发布时间】:2023-03-17 14:15:01
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 您的输入矩阵是否总是有0s 的边界,或者您只想修剪所有为0s 的边缘?
  • 只有边都是0s
  • @Junuxx 这是一个二维矩阵,所以不是完全重复的。
  • @shoelzer:您只需要将答案应用于两个轴。是的,有区别,但很微不足道。

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

【讨论】:

  • 如果中间有一个全为零的行/列,这是否按预期工作?
  • 如果矩阵在矩阵的中心有额外的零列或行,这种方法会有问题
  • @Junuxx 很好。我自己看到并按照您的评论进行了修复。
  • +1 表示any 解决方案。如果假设成立,那将非常优雅。但我仍然认为这个问题是重复的:p
  • 不错。好在它也可以写成匿名函数: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'));
【解决方案2】:

扩展到更高的维度:

假设要修剪一个 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 

【讨论】:

    【解决方案3】:

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

    [r1, c1] = find(x, 1, 'first')
    [r2, c2] = find(x, 1, 'last')
    x(r1:r2, c1:c2)
    

    【讨论】:

    • 这不起作用,因为findx 视为线性数组,然后转换为行/列索引。它在[1 0 0; 1 1 0; 1 0 0] 之类的矩阵上中断。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2011-12-30
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多