你可以在這種情況下做出最好的優化是自己實現norm
採取矩陣乘法的優勢,而不是遍歷各個元素。
回想一下,對於矢量值,norm(v)
計算norm(v, 2)
,這是歐氏距離
norm(v, 2) = (sum (abs (v) .^ 2))^(1/2)
既然你只需要找到的最小距離,你實際上並不需要採取平方根,直到後來。爲了緊湊,讓a = x(i, :)
,b = y(j, :)
,M = length(x)
和N = length(y)
。由於您的變量v
包含不同的向量,我們可以擴大distvect
計算到
distvect = norm(v)
= norm(x(i, :) - y(j, :))
= norm(a - b)
= (sum (abs(a - b) .^ 2))^(1/2)
distvect^2 = sum (abs (a - b) .^ 2)
現在,展開二次項,(a - b)^2 = a^2 - 2ab + b^2
,這使得abs
功能冗餘
distvect^2 = sum (sum(a.*a) * ones(1,N) - 2*a*b' + ones(M,1) * sum(b'.*b'))
最終的優化,它將跨多個值應用該功能。這是通過使用您的x
和y
矩陣的外積來創建length(x)
通過length(y)
矩陣來完成。然後,沿着每一列取最小距離並對結果的平方根求和
xx = sum(x .* x, 2) * ones(1, length(y))
xy = x * y'
yy = ones(length(x), 1) * sum(y' .* y')
dist = sum(sqrt(min(xx - 2.*xy + yy)))
我認爲存在一些錯誤。用x = rand(440,2),y = rand(740,2); –
謝謝,我認爲它現在已經修復。我正在總結錯誤的軸。 – Lucas
太好了,非常感謝。這正是我所期待的,這種方式要快得多。 – grus