我有矩陣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向量之間的距離)。
什麼是最好的計算方法?
我有矩陣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向量之間的距離)。
什麼是最好的計算方法?
如果您沒有統計工具箱,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));
從A
和B
用於矢量Q
各個值的列的索引可以通過計算來獲得一對索引:第一個是矩陣A
中的列索引,第二個是矩陣B
中的列索引。
如果你沒有pdist2,並且還可能會更快對於非常大的矩陣的另一種解決方案是向量化下面的數學事實:
|| XY ||^2 = || X ||^2 + || y ||^2 - 2 * dot(x,y)
其中|| a ||是a的L2範數(歐氏範數)。
評論:
這樣就夠了還是需要顯式代碼?
這可能是漸近較快的原因是您避免對所有x * y比較進行度量計算,因爲您只是將矩陣乘法(矩陣乘法在matlab中進行了高度優化)做了瓶頸。你正在利用這個事實,即這是歐氏距離,而不僅僅是一些未知的度量。