比较两组向量

时间:2013-03-10 17:03:50

标签: matlab vector

我有矩阵A和B

size(A) = [n x]; size(B) = [n y];

现在我需要比较A的每个列向量的每个列向量的欧几里德距离。我现在正在使用dist方法

Q = dist([A B]); Q = Q(1:x, x:end);

但它也有很多不必要的工作(比如分别计算A和B矢量之间的距离)。

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

3 个答案:

答案 0 :(得分:2)

您正在寻找pdist2

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

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

答案 1 :(得分: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中每个值的BQ列的索引:

[X(:), Y(:)]

其中每一行包含一对索引:第一行是矩阵A中的列索引,第二列是矩阵B中的列索引。

答案 2 :(得分:0)

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

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

其中|| a ||是a的L2范数(欧几里德范数)。

评论:

  1. C = -2 * A'* B(这是x乘y矩阵)是点积的矢量化。
  2. || x-y || ^ 2是您正在寻找的欧氏距离的平方。
  3. 这还够,还是需要显式代码?

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