给定一组数据点,找到“最接近”的数据点

时间:2012-05-08 16:00:27

标签: matlab euclidean-distance

因此我们有一个3D点参考集(让我们称之为R),以及许多其他3D点集(让我们称之为一组数据点P,以及该Pi中的每个数据集)。

任务是返回最小化数据指向某些Pi和R的欧氏距离的Pi。我看到它的方式是:

  1. 对于Pi中的每个点,与R中的每个点进行比较,找出两点之间的最小差异。
  2. 总结这些最小距离,以达到Pi和R之间的最小总差异。
  3. 答案Pi是差异最小的答案。
  4. 但这非常疯狂,因为它意味着从根本上看R中每个点与P中的每个点之间的距离,可能是数千或数百万。当然,我可以做得更好。

    我在Matlab工作,我不习惯。

    什么是更好的算法?是否有适合这种情况的数据结构? (例如K-D树?)

1 个答案:

答案 0 :(得分:1)

除非你有这么多疯狂的分数才真正成为一个性能问题,否则与每一点相比确实是最简单的解决方案,特别是因为这些操作可以在Matlab中高度矢量化。

例如:

R = [1 2 3; 1 3 4];
P{1} = [2 3 5;1 1 2;2 1 3];
P{2} = [4 4 4];

nP = length(P);
sumMinDist = zeros(nP,1);

%# make R into n-by-1-by-3 already
Rperm = permute(R,[1 3 2]);

for iP = 1:nP

%# since we want to sum up the minima, we need to take the square root
allDist = sqrt( sum( bsxfun(@minus, Rperm, permute(P{iP},[3 1 2])).^2, 3));

%# sum the minima (you may want to consider
%# taking the mean instead!)
sumMinDist(iP) = sum(min(allDist,[],1));

end

%# now we can identify the closest set
[~,idxOfClosestSet] = min(sumMinDist);