【问题标题】:How to find nearest points from two different sized sets with Matlab?如何使用 Matlab 从两个不同大小的集合中找到最近的点?
【发布时间】:2013-07-25 09:54:49
【问题描述】:

我有两组,每组分别包含一系列点和代码的 x,y 坐标。

考虑到文件的巨大大小,我正在 Matlab 中寻找一种优化的方法,将第一组中的每个点与第二组中的点连接起来,该点是根据在坐标值的帮助下计算的欧几里德距离最近的。

    X        Y

A=[155413 4564566; 156464 456585; ... ; n]


   code   X       Y
B=[1001 155413 4564566; 1015 156464 456585; ... ; m]

棘手的部分是它们的长度不同。对于每个点(A 线),我需要 B 中相应的“代码”变量,因为它是最接近的。

谢谢。

【问题讨论】:

  • 只是一个建议,不了解您的数据的更多信息,但如果它们形成不相交的集合,您可以尝试涉及 2 个集合的凸包。
  • 在这里查看我的答案:stackoverflow.com/questions/10639925/… 我的作品适用于 x,y,z,因此您可能需要将一些 3s 更改为 2s(但不是全部)

标签: matlab optimization coordinates


【解决方案1】:

由于有两个坐标,因此可以使用基于复数的方法,从而得到一个非常简单的解决方案:

A = [1 2; 3 4; 5 6; 7 8; 9 10]; % GPS points
B = [1001 0 0; 1002 7 7]; % postcode points

A_compl = A(:,1) + j*A(:,2); % transform to complex
B_compl = B(:,2) + j*B(:,3);
[AA BB] = meshgrid(A_compl, B_compl); % generate all combinations
distance = abs(AA-BB); % Euclicean distance in R^2 is modulus in C
[min_distance min_index] = min(distance);
code = B(min_index,1) % solution

这需要两个复数数组,AABB,大小为 numA 乘以 numB,其中 numA 和 numB 表示 A 点和 B 点的数量。如果它们对于您的计算机内存来说太大了,您将需要一个 for 循环来将 A 分成可接受大小的块。

【讨论】:

  • 嗨!谢谢。这是一个优雅的解决方案,但我遇到了内存问题。最终我只使用坐标数组作为 knnsearch 函数的输入。很方便! :)
  • 欢迎您!无论如何,内存问题可以通过 A 上的 for 循环来解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2013-08-08
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 2021-12-26
  • 2013-06-28
相关资源
最近更新 更多