2017-06-13 67 views
0

我有一堆(或多或少3500)的矢量与4096组件,我需要一个快速的方法来看,给定输入的另一个矢量具有相同的长度,这是最接近的N. 我想用一些matlab函数来做到这一点。这对我需要的东西好吗?搜索k个最近的元素

https://uk.mathworks.com/help/stats/classificationknn-class.html

+1

提示:如果您的问题可以回答“是”,那么它很可能不适合stackverflow。请注意,可能这个答案是“否”,但仍然如此。 –

+0

[K-Nearest Neighbors](https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm)算法将向量分组为K个簇。每个集群中心是集群成员的平均(重心)。要找到最近的矢量,您首先要确定最近的聚类中心,然后搜索聚类以查找聚类内最近的矢量。 –

回答

1

你所建议的是一个聚类功能,这将使N个集群的所有的载体。不知道这是你想要的。如果您只需要在一堆矢量之间N个最小距离,则可以手动轻松完成。喜欢的东西:

distances = matrixOfvectors - yourVector; % repmat(your...) if you have older Matlab. 
[val, pos] = sort(sum(distances.^2, 2)); % Sum might need 1 instead of 2, depends whether vectors are rows or columns. 
minVectors = pos(1:N); % Take indices of N nearest to get which vectors are the closest. 

如果N是小,说3个或更少,这将是稍快,以避免排序,只是简单地比较每一个新的载体与第二大先,然后根据结果第一或第三。

+0

不幸的是,这个方法应该很耗时,因为我的N是4096,比较的数量是〜3500。所以我需要更快的东西。 –

+0

我错了,显然在matlab中有这样一个脚本: tic; sA =大小(A); B = rand(1,4096); C = repmat(B,sA(1),1); disAC = A - C; [val,pos] = sort(sum(disAC。^ 2,2)); minVectors = pos(1:10); toc 或多或少需要0.1秒,这对我的目的来说没问题。非常感谢你! –