没有循环的矩阵运算

时间:2017-03-15 14:00:39

标签: matlab matrix

我有一个矩阵,其中包含5个点的几何坐标。

centroids = [x1,x2;...;x5,y5]

我想构建一个包含所有其他点距离的矩阵。

distance  =

     inf         pt1-pt2     pt1-pt3     pt1-pt4     pt1-pt5
     pt2-pt1     inf         pt2-pt3     pt2-pt4     pt2-pt5
     pt3-pt3     pt3-pt2     inf         pt3-pt4     pt3-pt5
     pt4-pt1     pt4-pt2     pt4-pt3     inf         pt4-pt5
     pt5-pt1     pt5-pt2     pt5-pt3     pt5-pt4     inf

我使用inf因为那时我想用每行的索引[value,index] = min(distance(.....))取min。

目标是有一个这样的最终矩阵:

result =
     indice_of_the_closest      dist
     indice_of_the_closest      dist
     indice_of_the_closest      dist
     indice_of_the_closest      dist
     indice_of_the_closest      dist

我通过循环实现这一点,但我需要一些帮助才能在没有循环的情况下执行此操作。

祝你好运

1 个答案:

答案 0 :(得分:3)

如果您没有统计工具箱,则可以执行此类操作

% Compute the pair-wise distances
d = sqrt((x(:,1) - x(:,1).').^2 + (x(:,2) - x(:,2).').^2);

% If you are on MATLAB < 2016b
% d = sqrt(bsxfun(@minus, x(:,1), x(:,1).').^2 + bsxfun(@minus, x(:,2), x(:,2).').^2);

% Set the diagonal to Inf
d(logical(eye(size(d)))) = Inf;

% Find the minimum distance and index
[mindist, ind] = min(d, [], 1);

% Create the output matrix
result = [ind(:), mindist(:)];

如果你拥有统计工具箱,你可以使用knnsearch找到每个点最近的两个点(第一个最接近的点是点本身)

[inds, dists] = knnsearch(x, x, 'k', 2);
result = [inds(:,2), dists(:,2)];