在MATLAB中矢量化矩阵的加权和

时间:2014-12-26 10:17:25

标签: matlab for-loop matrix sum vectorization

我试图在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

3 个答案:

答案 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调用。

方法#1

[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

方法#2

[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

将其用于无味卡尔曼滤波器,效果很好。