0

我最近越来越多地进入 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

但是:首先,这还不完全奏效,因为由于 length(result)=j+1 而我得到了一个越​​界错误,而且 res(j) = 1 似乎被循环覆盖了。但这只是为了测试和演示。因为这里显示的网格只是示例,而我使用的网格相当大,结果矩阵最多包含 2000x2000 = 4 个 mio 节点 --> 长度(结果)~4mio。把它放到一个贯穿整个长度的嵌套 for 循环中很可能会扼杀我的记忆。

因此,我希望找到一个不需要嵌套循环但利用 Matlabs 查找和巧妙的矩阵索引的复杂解决方案。我想不出什么,但希望能在这里得到帮助。

非常感谢讨论和帮助!

干杯,

西奥

4

1 回答 1

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')

我将被确定为重叠的点平方:

重叠网格

此外,与您的问题相关的是这个Puzzler: TMW 的 Doug Hull 的重叠矩形。

于 2013-04-19T10:55:10.370 回答