在我的应用中,我需要在一组矢量(即矩阵)中找到输入矢量的“最接近”(最小欧几里德距离矢量)
因此我每次都必须这样做:
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函数可以轻松完成这类工作(代码量很少)?
感谢您的帮助!
答案 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
应该用于更复杂的功能,其中矢量化方法更难以获得。