Matlab 比较两组向量

Matlab 比较两组向量,matlab,vector,Matlab,Vector,我有矩阵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向量之间的距离) 最好的计算方法是什么?您正在寻找的 您应该对矩阵进行转置,因为假设观测值是在行中,而不是在列中。您正在寻找的 您应该对矩阵进行转置,因为假设观测值是在行中,而不是在列中。如果您没有统计工具

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

最好的计算方法是什么?

您正在寻找的

您应该对矩阵进行转置,因为假设观测值是在行中,而不是在列中。

您正在寻找的


您应该对矩阵进行转置,因为假设观测值是在行中,而不是在列中。

如果您没有统计工具箱,另一种解决方案是手动计算。例如,一种方法是:

[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));
向量
Q
中每个值的
A
B
列的索引可通过计算得到:

[X(:), Y(:)]

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

中的列索引。如果没有统计工具箱,另一个解决方案是手动计算。例如,一种方法是:

[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));
向量
Q
中每个值的
A
B
列的索引可通过计算得到:

[X(:), Y(:)]

其中每一行包含一对索引:第一个是矩阵
a
中的列索引,第二个是矩阵
B
中的列索引。如果没有pdist2,另一个解决方案是将以下数学事实矢量化,这对于非常大的矩阵可能更快:

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

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

评论:

  • C=-2*A'*B(这是一个x×y矩阵)是点积的矢量化
  • ||x-y | | ^2是要查找的欧几里得距离的平方
  • 这足够了吗?还是需要显式代码


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

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

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

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

    评论:

  • C=-2*A'*B(这是一个x×y矩阵)是点积的矢量化
  • ||x-y | | ^2是要查找的欧几里得距离的平方
  • 这足够了吗?还是需要显式代码

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