我试图在MATLAB中对以下操作进行矢量化,但它让我感到难过。我从经验中学到,通常 是一种方式,所以我还没有放弃。任何帮助将不胜感激。
我有一组m
行向量,每个行向量大小为n
,排列在 m x n 矩阵中;称之为X
。
我还有一个m大小的权重向量, w 。
我想计算X
中向量的自我外积所形成的矩阵的加权和。
这是一个使用for
循环的MWE:
m = 100;
n = 5;
X = rand(m, n);
w = rand(1, m);
S = zeros(n, n);
for i = 1 : m
S = S + (w(i) * X(i, :)' * X(i, :));
end
S
答案 0 :(得分:3)
这可能是最快的方法:
S = X' * bsxfun(@times, X, w(:));
您也可以
S = squeeze(sum(bsxfun(@times, ...
bsxfun(@times, conj(X), permute(X, [1 3 2])), w(:)), 1));
(或者如果不需要则去除复合共轭物。)
答案 1 :(得分:3)
您可以在此处使用两种方法,使用一个 bsxfun
来电,少数 permutes
和 reshapes
。重塑技巧基本上允许我们使用有效的matrix multiplication
,从而避免我们可能需要的额外bsxfun
调用。
[m1,n1] = size(X);
XXmult = bsxfun(@times,X,permute(X,[1 3 2])); %// For X(i, :)' * X(i, :) step
S = reshape(reshape(permute(XXmult,[2 3 1]),[],m1)*w(:),n1,[]) %// multiply weights w
[m1,n1] = size(X);
XXmult = bsxfun(@times,permute(X,[2 3 1]),permute(X,[3 2 1]));
S = reshape(reshape(XXmult,[],m1)*w(:),n1,[])
答案 2 :(得分:1)
最短的回答,可能最快:
S = X' * diag(W)* X
将其用于无味卡尔曼滤波器,效果很好。