从 MATLAB 中的 delaunay 三角剖分(或通用算法)中的 k-最近邻搜索

k-nearest neaighbors search from delaunay triangulation in MATLAB (or general algorithm)

我知道我可以使用诸如 kd-tree 之类的数据结构来查找与平面中每个点最近的 k 个点(使用欧氏距离)。但是我已经在我的程序中构建了一个 Delaunay 三角剖分,所以我想通过利用 Delaunay 三角剖分更有效地找到 k 个最近的邻居。我正在使用 Matlab,并且 delaunayTriangulation class 允许仅查询给定点的第一个最近邻居。如何使用 Delaunay 三角剖分在 MATLAB 中找到 k 个最近的邻居?或者,如果我必须自己实现来自 Delaunay 三角剖分的 k 最近邻搜索算法,你能指出这样的算法吗?

如果您只对找到最接近质心的 k 个点感兴趣,那么请忘记您有三角形。你有一个点云(那个云与三角形有关,但它无关紧要)你需要找到它的 kn 个最近的邻居。

knnsearch()就够了。


原回答:

当我遇到这个问题时,我找到了 2 个有效的解决方案。

  1. 如果要K近邻到任意点,需要建树。我使用 R* 树是因为它们允许体积对象,但如果你只考虑元素的质心,那么你可以使用更容易编码的树来生存。

  2. 如果你想要一个元素本身的 K 个最近邻居,我发现最好的方法是构建网络图。 Delaunay 三角剖分不是结构化的,一旦增加它,在此列表中的查找就会变得难以处理,因此您需要强制执行一些顺序。您需要构建一个图表来对这些元素进行排序并存储它们的邻居,因此如果您感兴趣,您可以简单地查询与元素相距一定距离的邻居。

我发现没有 MATLAB 函数可以为我和 I ended up writing my own stuff 解决这个问题。这是在一个更大的框架中使用四面体作为计算机断层扫描的图像基础,所以在那个 repo 中有很多额外的东西,可能需要在这里和那里接触。使用风险自负。