【问题标题】:minimum distance between two set of 2D points (x1,y1) , (x2,y2)两组 2D 点 (x1,y1) , (x2,y2) 之间的最小距离
【发布时间】:2020-11-17 14:11:43
【问题描述】:

我遇到了标题中描述的问题,我正在使用 MATLAB 2020。

我有 2 组 2D 点,我想找到这两个点(每个点来自不同的集合) 与所有其他点的距离最小min(distance(pi,pj)) 我做了一些研究(谷歌)并找到了这篇文章: “计算两个有限平面集之间最小距离的最优算法” 在此网页中:

What is the fastest algorithm to calculate the minimum distance between two sets of points?

我尝试使用 MATLAB 和 Garbriel 图的代码(我在 google 中找到)来实现该算法 这里:

http://matgeom.sourceforge.net/doc/api/matGeom/graphs/gabrielGraph.html

问题是当我运行代码时,假设是算法与“蛮力算法”(两个循环),蛮力总是更快......无论我使用多少点,它速度更快......这与逻辑(我的)和上面提到的文章形成鲜明对比。

当我检查代码行的执行时间时,我发现该行

dist = dist + (repmat(p1(:,i), [1 n2])-repmat(p2(:,i)', [n1 1])).^2;

在:

minDistancePoints(p1, varargin) 

是“问题” 和建议? 谢谢

附言 让

set1=random(100,2) 
set2=random(100,2)

我想找到 set1 中的 point1 和 set2 中的 point2 与所有其他点的距离最小。

【问题讨论】:

  • 你能分享一个例子吗?如果您的每组 2D 点都有 1 个点,Bruteforce 会更快。如果您有 100 万个点,替代方案可能会更快。也许每种方法的实现都不是最理想的。没有完整的例子我们无法知道
  • Gabriel 图例程 (1) 似乎自己计算所有对距离 (2) 调用 delaunayn。您应该直接在delaunayn 之上构建。
  • 你试过dsearchn吗?

标签: algorithm matlab


【解决方案1】:

使用隐式扩展,我们可以一次计算所有可能的组合,然后在p1 中找到最小距离总和的点:

p1 =    [0 -1;
         2 3;
         8 8]
p2 =    [1 1;
         2 3;
         3 5;
         3 3]
         
[~,closest_p1] = min(sum(sum((permute(p1,[3,2,1])-p2).^2,2).^0.5))

我向p1 添加了一个维度:permute(p1,[3,2,1]),所以现在我们可以计算这个新的第三维度中的所有组合。

closest_p1 给出使p2 中每个点之间的欧几里得距离之和最小化的点的索引。在此示例中为closest_p1 = 2

还注意到您使用的算法似乎也计算了所有可能的组合。

【讨论】:

  • 我忘了提到,因为我的代码假设运行多次带有大量点(数据),我希望代码尽可能高效,从我读到的最有效的是O(nlog n)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
相关资源
最近更新 更多