[英]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.