我有两个矩阵:
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;
答案 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)
使用bsxfun
,permute
并根据原生方法计算欧几里德距离
这可能看起来不太优雅,但对于小数据
,其速度要快于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。
<强>结论:强>
对于大型数据,pdist2
效率非常高,而bsxfun
+ permute
可用于非常小的数据量。