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