【问题标题】:Overlap 2D matrix in Octave在 Octave 中重叠二维矩阵
【发布时间】:2012-06-21 17:15:58
【问题描述】:

假设我有一个矩阵。这个矩阵是空白的,除了一些创建相同大小的矩形的点。创建矩形的每个点都有一个正数,该正数对于该矩形的所有点都相等。这个矩阵可能有几个矩形,每个矩形都有相同的数字。

现在想象一下,我有第二个具有相同结构的矩阵,但现在矩形位于其他位置,具有其他大小和其他值,就像图片中的矩阵 A 和 B。

我想合并两个矩阵,所以如果某个矩形有交集,则删除最小数量的矩形。

最好的方法是什么?我认为 fors 是可行的,但我想做 30 次,所以如果我不改进它,Octave 将需要很长时间才能完成它。

【问题讨论】:

  • 如果重叠的矩形具有相同的值怎么办
  • 在我的应用中发生这种情况很奇怪,所以然后删除你想要的。
  • 使用fors 并不一定意味着它与oneliner 相比效率低下。相反,将你的问题强行压缩到几个函数中可能会得到相反的结果。如果性能是您的限制因素,我建议以您管理的最有效方式开始使用fors,然后将其与答案中的任何紧凑解决方案进行比较。

标签: algorithm matlab octave


【解决方案1】:

我编写了这个似乎可以完成这项工作的小代码:

A=[0 0 1 1 1 0 ;
   0 0 1 1 1 0 ;
   0 0 0 0 0 0 ;
   2 2 0 0 0 0 ;
   2 2 0 0 0 0 ;
   2 2 0 0 0 0 ];

B=[3 0 2 2 0 0 ;
   3 0 2 2 0 0 ;
   0 0 2 2 0 0 ;
   0 0 0 0 0 0 ;
   1 1 1 1 1 0 ;
   1 1 1 1 1 0 ];


%give a unique id to each rectangle
lblA=bwlabel(A);
lblB=bwlabel(B);

%search for overlap
overlap= A & B;

% find out overlaping rectangle s unique id
overlapLbl= unique([lblA(overlap(:)) lblB(overlap(:))],'rows');

%eliminate rectangle with lower score
for ov=1:size(overlapLbl,1)
  scoreA=A(find((lblA==overlapLbl(ov,1)),1));
  scoreB=B(find((lblB==overlapLbl(ov,2)),1));
  if scoreA>scoreB
    B(B==scoreB)=0;
  else
    A(A==scoreA)=0;
  end
end
C=A+B

输出:

C =
     3     0     2     2     0     0
     3     0     2     2     0     0
     0     0     2     2     0     0
     2     2     0     0     0     0
     2     2     0     0     0     0
     2     2     0     0     0     0

【讨论】:

  • 太棒了。这就是我一直在寻找的。我知道我应该在一个新问题中提出这个问题,但是,是否可以从单点创建矩形,以便在最后它们不重叠?我的意思是,我没有矩形。我有点,然后我创建了矩形,因为我需要它们,但我的方法是做 fors 所以我在水平方向和垂直方向上添加了我需要的多次相同的矩阵,所以最终创建了矩形,但我不认为关于它们在创建时是否重叠
猜你喜欢
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 2015-05-23
  • 1970-01-01
相关资源
最近更新 更多