我有两个相关的Nx3数据集(一个是xyz点,另一个是这些点的法线向量)。我在第一个数据集中有一个点,现在我想在第二个数据集中找到匹配的行。最好的方法是什么?我在想打印出行号,但不确定代码是做什么的呢?
答案 0 :(得分:1)
假设您的一个数据集中的点大小为1 x 3,则有两种方法可以执行此操作。
knnsearch
最简单的方法是使用统计工具箱中的knnsearch
。
knnsearch
代表K-Nearest Neighbor搜索。给定输入查询点,knnsearch
在给定输入查询点的情况下找到与您的数据集最近的k
个点。在您的情况下,k=1
。此外,距离度量是欧几里德距离,但是看看你的点在3D笛卡尔空间中的情况,我不认为这是一个问题。
因此,假设您的xyz
点存储在X
中且查询点(法线向量)位于y
中,请执行以下操作:
IDX = knnsearch(X, y);
以上默认为k=1
。如果你想要超过1分,你会这样做:
IDX = knnsearch(X, y, 'K', n);
n
是您要返回的点数或给出查询n
的{{1}}最近点。 y
包含IDX
中最接近X
的点的索引。我还想指出y
的排列方式是每个行是一个点,每个列是一个变量。
因此,使用X
的最近点是:
IDX
bsxfun
如果您没有统计工具箱,则可以使用bsxfun
轻松实现相同的功能。请记住,我将编写的代码仅用于返回最近的点,或closest_point = X(IDX,:);
:
k=1
dists = sqrt(sum(bsxfun(@minus, X, y).^2, 2));
[~,IDX] = min(dists);
调用首先确定bsxfun
与y
中每个点之间的分量距离。一旦我们这样做,我们对每个组件进行平方,将所有组件加在一起,然后取平方根。这基本上找到了X
的欧几里德距离和y
中的所有点。这为我们提供了X
个距离,其中N
是数据集中的总点数。然后,我们找到与min
的最小距离,并确定最接近匹配点的位置索引,该索引对应于N
与数据集之间的最近点。
如果您想将其扩展到多个点,则按升序对距离进行排序,然后检索距离最小的点数。请记住,较小的欧几里德距离意味着点相似,这就是我们按升序排序的原因。像这样:
y
距离我们之前的一小步还有一小步。您不必使用dists = sqrt(sum(bsxfun(@minus, X, y).^2, 2));
[~,ind] = sort(dists);
IDX = ind(1:n);
,而是使用sort
并获取min
的第二个输出来确定最小距离的位置。然后,我们会将sort
编入索引以获取ind
最接近的索引,最后将索引编入n
以获取实际积分。
你会再次做同样的事情来检索最接近的实际点:
X
如果您想了解更多关于K-Nearest Neighing如何运作的信息,我建议您在此阅读我的帖子:
祝你好运!