我在 Matlab 中有串列 xA、yA、zA 和串列 xB、yB、zB。其中包含 A 型和 B 型點的 x、y 和 z 坐標。A 型和 B 型點的數量可能不同。
我想計算一個包含 A 型和 B 型點之間的歐幾里得距離的矩陣。當然,我只需要計算矩陣的一半,因為另一半包含重復資料。
最有效的方法是什么?
完成后,我想找到最接近 A 型別點的 B 型別點。然后如何找到最接近、第二接近、第三接近等 B 型別點的坐標?
uj5u.com熱心網友回復:
給定一個A大小矩陣[N,3]和一個大小矩陣B,[M,3]您可以使用pdist2函式來獲取一個[M,N]包含所有成對距離的大小矩陣。
如果您想按點到第th 點B的距離對這些點進行排序,那么您可以對成對距離矩陣的第 th 行進行排序。rAr
% generate some example data
N = 4
M = 7
A = randn(N,3)
B = randn(M,3)
% compute N x M matrix containing pairwise distances
D = pdist2(A, B, 'euclidean')
% sort points in B by their distance to the rth point in A
r = 3
[~, b_idx] = sort(D(r,:))
然后b_idx將包含in 中的點的索引B,按它們到 中的r第 th 點的距離排序A。B因此, order by中的實際點b_idx可以用 獲得B(b_idx,:),其大小與 相同B。
如果你想為所有r你可以使用的
[~, B_idx] = sort(D, 1)
同時對所有行進行排序D。然后第rth 行將B_idx包含b_idx.
如果您的唯一目標是找到每個點的最近k點(對于小于的某個正整數),那么我們通常不希望計算所有成對距離。這是因為空間劃分資料結構(如KD 樹)可用于提高搜索效率,而無需顯式計算所有成對距離。BAkM
Matlab 提供了一個knnsearch函式,它使用 KD-trees 來達到這個目的。例如,如果我們這樣做
k = 2
B_kidx = knnsearch(B, A, 'K', k)
然后B_kidx將是 的前兩列B_idx,即 中A最近兩個點的索引中的每個點B。另外,請注意,這只會比相對較小的pdist2方法更有效。k如果k太大,knnsearch則將自動使用之前的顯式方法而不是 KD-tree 方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/443543.html
