[英]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)
之间的标准化距离的分量。
您可以按如下方式调整您的方法以满足您的需求:
x
或v
的维度,使其列数成为第三维度。 我在下面的代码中选择了v
。bsxfun
)来计算2
× M
× N
差分数组,其中M
和N
是x
和v
的列数。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.