gpt4 book ai didi

matlab - 从数组的每一行中减去多个向量( super 广播)

转载 作者:太空宇宙 更新时间:2023-11-03 20:21:37 26 4
gpt4 key购买 nike

我有一个数据集 X,即 m x 2,三个向量存储在矩阵 C = [c1'; c2'; c3']3 x 2。我正在尝试对我的代码进行矢量化,该代码发现,对于 X 中的每个数据点,C 中的哪个向量最接近(平方距离)。我想从 X 中的每个向量(行)中减去 C 中的每个向量(行),得到 m x 63m x 2 X 的元素与 C 的元素之间的差异矩阵。我当前的实现一次在 X 中执行一行:

for i = 1:size(X, 1)
diffs = bsxfun(@minus, X(i,:), C); % gives a 3 x 2 matrix result
[~, idx(i)] = min(sumsq(diffs), 2); % returns the index of the closest vector
% in C to the ith vector in X
end

我想摆脱这个 for 循环,只是对整个事情进行矢量化,但是 bsxfun(@minus, X, C) 在 Octave 中给我一个错误:

error: bsxfun: nonconformant dimensions: 300x2 and 3x2

关于如何在这两个矩阵之间“ super 广播”我的减法运算有什么想法吗?

最佳答案

此问题的核心是计算大小为 m x 3 的距离矩阵 D,其中包含 X 中所有数据点之间的成对距离> 和 C 中的所有数据点。 X中的第i个向量x_iC中的第j个向量c_j之间的欧式距离可以改写为:

|x_i-c_j|^2 = |x_i|^2 - 2<x_i, c_j> + |c_j|^2

其中<,>指的是内积。这个等式的右边可以很容易地向量化,因为所有对的内积就是 X * C',这是 BLAS3 运算。这种计算距离矩阵的方法在 Christopher Bishop 的模式识别和机器学习一书中称为 dist2 函数。我复制了下面的函数,稍作修改。

function D = dist2(X, C)        
tempx = full(sum(X.^2, 2));
tempc = full(sum(C.^2, 2).');
D = -2*(X * C.');
D = bsxfun(@plus, D, tempx);
D = bsxfun(@plus, D, tempc);

此处的full用于XC是稀疏矩阵的情况。

注意:由于数值舍入误差,以这种方式计算的距离矩阵 D 可能有微小的负项。为了防止这种情况,使用

D = max(D, 0);

C 中最近向量的索引可以从 D 中检索:

[~, idx] = min(D, [], 2);

关于matlab - 从数组的每一行中减去多个向量( super 广播),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17178500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com