2013-03-10 97 views
1

我有矩陣A和B比較兩個矢量集中

size(A) = [n x]; size(B) = [n y]; 

現在我需要比較來自B的每列向量A的每一列向量的歐幾里得距離我使用dist法權現在

Q = dist([A B]); Q = Q(1:x, x:end); 

但它也很多不必要的工作(如分別計算A和B向量之間的距離)。

什麼是最好的計算方法?

回答

2

您正在尋找pdist2

% Compute the ordinary Euclidean distance 
D = pdist2(A.',B.','euclidean'); % euclidean distance 

你應該因爲pdist2矩陣的轉置假設觀測行,而不是在列。

1

如果您沒有統計工具箱,pdist2的替代解決方案是手動計算此值。例如,要做到這一點的一種方式是:

[X(:), Y(:)] 

其中每一行包含一個:

[X, Y] = meshgrid(1:size(A, 2), 1:size(B, 2)); %// or meshgrid(1:x, 1:y) 
Q = sqrt(sum((A(:, X(:)) - B(:, Y(:))) .^ 2, 1)); 

AB用於矢量Q各個值的列的索引可以通過計算來獲得一對索引:第一個是矩陣A中的列索引,第二個是矩陣B中的列索引。

0

如果你沒有pdist2,並且還可能會更快對於非常大的矩陣的另一種解決方案是向量化下面的數學事實:

|| XY ||^2 = || X ||^2 + || y ||^2 - 2 * dot(x,y)

其中|| a ||是a的L2範數(歐氏範數)。

評論:

  1. C = -2 * A'* B(這是由y矩陣x)是點積的矢量化。
  2. || x-y ||^2是你正在尋找的歐幾里得距離的平方。

這樣就夠了還是需要顯式代碼?

這可能是漸近較快的原因是您避免對所有x * y比較進行度量計算,因爲您只是將矩陣乘法(矩陣乘法在matlab中進行了高度優化)做了瓶頸。你正在利用這個事實,即這是歐氏距離,而不僅僅是一些未知的度量。