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)
之间的规范距离的分量。
您的方法可以根据您的需要进行如下调整:
- Permute
x
或 v
的维度,以便其列数成为 第三个 维度。我在下面的代码中选择 v
。
- 这让您可以利用 implicit expansion (or equivalently
bsxfun
) 来计算 2
×M
×N
差值数组,其中 M
和 N
是 x
和 v
. 的列数
- 沿第一个维度计算 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
。
我正在努力向量化一个函数,该函数在两个向量 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)
之间的规范距离的分量。
您的方法可以根据您的需要进行如下调整:
- Permute
x
或v
的维度,以便其列数成为 第三个 维度。我在下面的代码中选择v
。 - 这让您可以利用 implicit expansion (or equivalently
bsxfun
) 来计算2
×M
×N
差值数组,其中M
和N
是x
和v
. 的列数
- 沿第一个维度计算 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
。