MATLAB找到最近矢量的简短方法?

时间:2014-04-19 15:21:34

标签: matlab for-loop vector built-in euclidean-distance

在我的应用中,我需要在一组矢量(即矩阵)中找到输入矢量的“最接近”(最小欧几里德距离矢量)

因此我每次都必须这样做:

function [match_col] = find_closest_column(input_vector, vectors)
cmin = 99999999999; % current minimum distance
match_col = -1;    

    for col=1:width
        candidate_vector = vectors(:,c); % structure of the input is not important
        dist = norm(input_vector - candidate_vector);
        if dist < cmin
            cmin = dist;
            match_col = col;
        end
    end

是否有内置的MATLAB函数可以轻松完成这类工作(代码量很少)?

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

使用pdist2。假设(从您的代码中)您的向量是列,需要进行转置,因为pdist2适用于行:

[cmin, match_col] = min(pdist2(vectors.', input_vector.' ,'euclidean'));

也可以使用bsxfun完成(在这种情况下,直接使用列更容易):

[cmin, match_col] = min(sum(bsxfun(@minus, vectors, input_vector).^2));
cmin = sqrt(cmin); %// to save operations, apply sqrt only to the minimizer 

答案 1 :(得分:3)

norm无法直接应用于矩阵的每一列或每行,因此您可以使用arrayfun

dist = arrayfun(@(col) norm(input_vector - candidate_vector(:,col)), 1:width);
[cmin, match_col] = min(dist);

此解决方案也是here

,此解决方案为much much slower,而不是使用bsxfun进行直接计算(如Luis Mendo的答案),因此应避免使用此解决方案。 arrayfun应该用于更复杂的功能,其中矢量化方法更难以获得。