在matlab中的两个单独的数据集中查找匹配的行

时间:2015-05-23 11:09:48

标签: matlab vector

我有两个相关的Nx3数据集(一个是xyz点,另一个是这些点的法线向量)。我在第一个数据集中有一个点,现在我想在第二个数据集中找到匹配的行。最好的方法是什么?我在想打印出行号,但不确定代码是做什么的呢?

1 个答案:

答案 0 :(得分:1)

假设您的一个数据集中的点大小为1 x 3,则有两种方法可以执行此操作。

方法#1 - 使用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

方法#2 - 使用bsxfun

如果您没有统计工具箱,则可以使用bsxfun轻松实现相同的功能。请记住,我将编写的代码仅用于返回最近的点,或closest_point = X(IDX,:);

k=1

dists = sqrt(sum(bsxfun(@minus, X, y).^2, 2)); [~,IDX] = min(dists); 调用首先确定bsxfuny中每个点之间的分量距离。一旦我们这样做,我们对每个组件进行平方,将所有组件加在一起,然后取平方根。这基本上找到了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如何运作的信息,我建议您在此阅读我的帖子:

Finding K-nearest neighbors and its implementation

祝你好运!