我最近越来越多地进入Matlab,在我的最新项目期间出现了另一个问题。 我在整个边界内生成几个矩形(或网格)。 这些网格可以有不同的间距/间隔。
我这样做,因为我想降低数字高程模型某些区域的网格/像素分辨率。到目前为止,一切正常。 但由于可以在GUI中选择矩形,因此可能会出现矩形重叠的情况。这种重叠是我想要找到的,并删除。它们是否具有相同的间距,例如矩形1和2看起来像这样:
[t1x, t1y] = meshgrid(1:1:9,1:1:9);
[t2x, t2y] = meshgrid(7:1:15,7:1:15);
[t3x, t3y] = meshgrid(5:1:17,7:1:24);
在这种情况下,我可以使用unique来查找重叠区域。 但是,他们看起来更像是这样:
[t1x, t1y] = meshgrid(1:2:9,1:2:9);
[t2x, t2y] = meshgrid(7:3:15,7:3:15);
[t3x, t3y] = meshgrid(5:4:17,7:4:24);
因此,不能应用唯一,因为网格1可能与网格2很好地重叠而没有相同的节点。为了方便和进一步处理,所有矩形/网格都被列入列表示法并放在我的代码中的一个结果矩阵中:
result = [[t1x(:), t1y(:)]; [t2x(:), t2y(:)]; [t3x(:), t3y(:)]];
现在我正在考虑使用2个嵌套的for循环来解决这个问题,就像这样(它还没有完全发挥作用):
res = zeros(length(result),1);
for i=1:length(result)
currX = result(i,1);
currY = result(i,2);
for j=1:length(result)
if result(j,1)< currX < result(j+1,1) && result(j,2)< currY < result(j+1,2)
res(j) = 1;
end
end
end
但是:首先,这还不行,因为长度(结果)= j + 1我得到一个越界错误,而且res(j)= 1似乎被循环覆盖。 但这只是用于测试和演示。 因为这里显示的网格只是示例,我使用的网格相当大,结果矩阵包含高达2000x2000 = 4 mio节点 - &gt; lenght(结果)~4mio。 把它放到一个在整个长度上运行的嵌套for循环中很可能会扼杀我的记忆。
因此,我希望找到一个不需要嵌套循环的复杂解决方案,但利用Matlabs查找和聪明的矩阵索引。 我无法想到什么,但希望能在这里得到帮助。
非常感谢讨论和帮助!
干杯,
西奥
答案 0 :(得分:1)
以下是快速刺伤(未经过广泛测试):
% Example meshes
[t1x, t1y] = meshgrid(1:2:9,1:2:9);
[t2x, t2y] = meshgrid(7:3:15,7:3:15);
% Group points for convenience
A = [t1x(:), t1y(:)];
B = [t2x(:), t2y(:)];
% Compare which points of A within edges of B (and viceversa)
idxA = A(:,1) >= B(1,1) & A(:,1) <= B(end,1) & A(:,2) >= B(1,2) & A(:,2) <= B(end,2);
idxB = B(:,1) >= A(1,1) & B(:,1) <= A(end,1) & B(:,2) >= A(1,2) & B(:,2) <= A(end,2);
% Plot result of identified points
plot(A(:,1),A(:,2), '*r')
hold on
plot(B(:,1),B(:,2), '*b')
plot([A(idxA,1); B(idxB,1)], [A(idxA,2); B(idxB,2)], 'sk')
我确定了被确定为重叠的点:
此外,与您的问题相关的是TMW的Doug Hull的Puzzler: overlapping rectangles。