簡體   English   中英

在兩矩陣MATLAB中查找最近的位置

[英]Find Nearest Location in Two Matrix MATLAB

我有兩個矩陣:

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;

您可以使用pdist2 (Statistics Toolbox)計算行對之間的距離,然后沿着每個維度找到最小索引:

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

如果沒有統計工具bx,則可以用pdist2替換bsxfun來計算平方的歐幾里得距離:

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

使用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.');

標記標記 (預熱幾次后執行)

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秒。


A不同數據大小執行基准測試(使用timeit() ),使B數據大小恆定為20。

在此處輸入圖片說明


在此處輸入圖片說明

結論: pdist2是大datasizes顯著效率,同時bsxfun + permute可用於非常小的數據大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM