繁体   English   中英

MATLAB 向量化成对距离

[英]MATLAB Vectorised Pairwise Distance

我正在努力向量化一个 function,它在两个向量 x = 2xN 和 v = 2xM 之间执行某种成对差异,对于一些任意 N,M。我有这个在 N = 1 时工作,虽然,我想向量化这个function 适用于 N 任意的输入。

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

类似的帖子是这个,虽然我还不能概括它。

当前实施

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 矩阵),其中每一列代表不同的观察结果(请注意,这不是表示数据的传统方式)。

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

我们可以使用内置的 function 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;

这将返回一个矩阵out ,其中 position (i, j, :)处的元素是A(:,i)B(:,j)之间的标准化距离的分量。

您可以按如下方式调整您的方法以满足您的需求:

  1. 排列xv的维度,使其列数成为第三维度。 我在下面的代码中选择了v
  2. 这使您可以利用隐式扩展(或等效的bsxfun )来计算2 × M × N差分数组,其中MNxv的列数。
  3. 沿第一个维度计算向量方式 (2-) 范数,并再次使用隐式扩展对该数组进行归一化:
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);

如果您想要 output 的尺寸以另一个顺序排列,您可能需要以不同的方式应用permute

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM