在这种情况下,您可以进行的最佳优化是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)))