寻找Two Matrix MATLAB附近的酒店

时间:2015-05-26 11:30:57

标签: matlab matrix

我有两个矩阵:

A = [  76  159
      112  143
      153  159];

B = [  77   159
      114   143
      153   159
      173   236];

如何获得距离最近的位置的结果是距离另一个矩阵的最近位置的索引,如果可能的话没有循环。

对于上面的示例,结果如下所示:

iA = 1 2 3;
iB = 1 2 3 3;

2 个答案:

答案 0 :(得分:4)

您可以使用pdist2(统计工具箱)计算行对之间的距离,然后找到每个维度的最小化索引:

d = pdist2(A,B);     % // default is Euclidean distance. You can specify other metrics
[~, iB] = min(d);    % // arg min along each column
[~, iA] = min(d.');  %'// arg min along each row

如果您没有统计工具栏,则可以将pdist2替换为bsxfun来计算平方欧几里德距离:

d = squeeze(sum(bsxfun(@minus, A, permute(B,[3 2 1])).^2, 2));

答案 1 :(得分:1)

使用bsxfunpermute并根据原生方法计算欧几里德距离

这可能看起来不太优雅,但对于小数据

,其速度要快于pdist2
d = sqrt(sum((bsxfun(@minus,permute(A,[1 3 2]),permute(B,[3 1 2]))).^2,3));

[~, iB] = min(d);    %// from Luis's answer
[~, iA] = min(d.');

Bechmarking (在几次预热后执行)

tic
out = sqrt(sum((bsxfun(@minus,permute(A,[1 3 2]),permute(B,[3 1 2]))).^2,3));
toc

tic
d = pdist2(A,B); 
toc
  

经过的时间是0.000080秒   经过的时间是0.000453秒。

对不同数据大小timeit()执行基准分析(使用A),将B的数据大小保持为20。

enter image description here

enter image description here

<强>结论: 对于大型数据,pdist2效率非常高,而bsxfun + permute可用于非常小的数据量。