我有矩阵 A 和 B
size(A) = [n x]; size(B) = [n y];
现在我需要比较 A 的每个列向量与 B 的每个列向量的欧几里得距离。我现在正在使用dist
方法
Q = dist([A B]); Q = Q(1:x, x:end);
但它也做了很多不必要的工作(比如分别计算 A 和 B 的向量之间的距离)。
计算这个的最佳方法是什么?
pdist2
如果您没有统计工具箱,另一种解决方案是手动计算。例如,一种方法是:
[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
可以通过计算获得:
[X(:), Y(:)]
其中每一行包含一对索引:第一个是 matrix 中的列索引A
,第二个是 matrix 中的列索引B
。
如果您没有 pdist2 并且对于非常大的矩阵也可能更快的另一种解决方案是将以下数学事实矢量化:
||xy||^2 = ||x||^2 + ||y||^2 - 2*dot(x,y)
在哪里||一个|| 是 a 的 L2 范数(欧几里得范数)。
注释:
这足够了吗,还是您需要显式代码?
这可能会渐近更快的原因是您避免对所有 x*y 比较进行度量计算,因为您将瓶颈设为矩阵乘法(矩阵乘法在 matlab 中得到高度优化)。您正在利用这样一个事实,即这是欧几里德距离,而不仅仅是一些未知的度量。