MATLAB 向量化成对距离

MATLAB Vectorised Pairwise Distance

我正在努力向量化一个函数,该函数在两个向量 x = 2xN 和 v = 2xM 之间执行某种程度的成对差异,对于一些任意的 N,M。当 N = 1 时我可以使用它,虽然,我想将该函数矢量化以应用于任意 N 个输入。

事实上,我想要这个函数做的是为 x 的每一列找到 x(:,column) (a 2x1) 和 v (a 2xM) 之间的标准化差异。

一个类似的post是this,虽然我没能一概而论。

当前实施

function mat = vecDiff(x,v)

diffVec = bsxfun(@minus, x, v);
mat = diffVec ./ vecnorm(diffVec);

例子

x =
     1
     1

v = 
     1     3     5
     2     4     6

----
vecDiff(x,v) =
         0   -0.5547   -0.6247
   -1.0000   -0.8321   -0.7809

假设您的两个输入矩阵是 A(2 x N 矩阵)和 B(2 x M 矩阵),其中每一列代表不同的观察结果(请注意,这不是表示数据的传统方式)。

请注意,输出的大小为 N x M x 2。 out = zeros(N, M, 2);

我们可以使用内置函数pdist2找到它们之间的距离。

dists = pdist2(A.', B.');(矩阵方向需要转置)

要获得单独的 x 和 y 距离,我能想到的最简单的方法是使用 repmat:

xdists = repmat(A(1,:).', 1, M) - repmat(B(1,:), N, 1);
ydists = repmat(A(2,:).', 1, M) - repmat(B(2,:), N, 1);

然后我们可以通过之前找到的距离对其进行归一化:

out(:,:,1) = xdists./dists; 
out(:,:,2) = ydists./dists;

这个 returns 矩阵 out 其中位置 (i, j, :) 的元素是 A(:,i)B(:,j) 之间的规范距离的分量。

您的方法可以根据您的需要进行如下调整:

  1. Permute xv 的维度,以便其列数成为 第三个 维度。我在下面的代码中选择 v
  2. 这让您可以利用 implicit expansion (or equivalently bsxfun) 来计算 2×M×N 差值数组,其中 MNxv.
  3. 的列数
  4. 沿第一个维度计算 vector-wise (2-)norm 并再次使用隐式扩展对该数组进行归一化:
x = [1 4 2 -1; 1 5 3 -2];
v = [1 3 5; 2 4 6];
diffVec = x - permute(v, [1 3 2]);
diffVec = diffVec./vecnorm(diffVec, 2, 1);

如果您希望输出的尺寸按其他顺序排列,您可能需要以不同的方式应用 permute