我在2d平面上有一组点(x,y)。给定点(x0,y0)和数字k,如何在点集中找到(x0,x0)的第k个最近邻居。详细地,点集由两个数组表示:x和y。点(x0,y0)由索引i0给出。这意味着x0 = x(i0)和y0 = y(i0)。
Matlab中是否有任何功能或东西可以帮助我解决这个问题。如果Matlab没有这种功能,你能否提出任何其他有效的方法。
编辑:我必须为集合中的每个点(x0,y0)计算这种距离。集合的大小约为1000.k的值应约为sqrt(1500)。最糟糕的是我多次这样做。在每次迭代时,集合发生变化,我再次计算距离。因此,运行时间是一个关键问题。
答案 0 :(得分:6)
如果您要检查许多点,您可能需要先构建一个点间距离表
squareform(pdist([x y]))
答案 1 :(得分:4)
如果您有统计工具箱,则可以使用函数knnsearch。
答案 2 :(得分:2)
蛮力算法就是这样的:
array x[n] = ()
array y[n] = ()
array d[n] = ()
... populate x and y arrays with your n points ...
/* step over each point and calculate its distance from (x0, y0) */
for i = 1 to n
do
d[i] = distance((x0, y0), (x[i], y[i])
end
/* sort the distances in increasing order */
sort(d)
/* the k'th element of d, is the k'th nearest point to (x0, y0) */
return d[k]
答案 3 :(得分:2)
蛮力方法看起来像这样:
%Create some points
n = 10;
x = randn(n,1);
y = randn(n,1);
%Choose x0
ix0 = randi(n);
%Get distances
d = sqrt(...
(x - x(ix0) ).^2 + ...
(y - y(ix0) ).^2 );
%Sort distances
[sorted_Dstances, ixSort] = sort(d);
%Get kth point
k = 3;
kth = [x(ixSort(k+1)); y(ixSort(k+1))]; %+1 since the first element will always be the x0 element.
答案 4 :(得分:2)
free和opensource VLFeat工具箱包含一个kd-tree实现,以及其他有用的东西。