2017-06-13 71 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秒,這對我的目的來說沒問題。非常感謝你! –