2

我有矩阵 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 的向量之间的距离)。

计算这个的最佳方法是什么?

4

3 回答 3

3

您正在寻找pdist2.

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

您应该对矩阵进行转置,因为pdist2假设观察结果是在行中,而不是在列中。

于 2013-03-10T17:09:57.490 回答
1

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

于 2013-03-10T17:30:15.527 回答
0

如果您没有 pdist2 并且对于非常大的矩阵也可能更快的另一种解决方案是将以下数学事实矢量化:

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

在哪里||一个|| 是 a 的 L2 范数(欧几里得范数)。

注释:

  1. C=-2*A'*B(这是 ax by y 矩阵)是点积的矢量化。
  2. ||xy||^2 是您正在寻找的欧几里得距离的平方。

这足够了吗,还是您需要显式代码?

这可能会渐近更快的原因是您避免对所有 x*y 比较进行度量计算,因为您将瓶颈设为矩阵乘法(矩阵乘法在 matlab 中得到高度优化)。您正在利用这样一个事实,即这是欧几里德距离,而不仅仅是一些未知的度量。

于 2013-03-10T18:00:45.103 回答