MATLAB中矩阵加权和的矢量化
我试图在MATLAB中对下面的操作进行矢量化,但这让我很为难。我从经验中学到,通常是有办法的,所以我现在还没有放弃。任何帮助都将不胜感激 我有一个MATLAB中矩阵加权和的矢量化,matlab,for-loop,matrix,sum,vectorization,Matlab,For Loop,Matrix,Sum,Vectorization,我试图在MATLAB中对下面的操作进行矢量化,但这让我很为难。我从经验中学到,通常是有办法的,所以我现在还没有放弃。任何帮助都将不胜感激 我有一个m行向量集合,每个行向量的大小n,排列在一个mxn矩阵中;称之为X 我还有一个m大小的权重向量,w 我想计算由X中向量的自外积形成的矩阵的加权和 以下是一个MWE,使用for循环: m = 100; n = 5; X = rand(m, n); w = rand(1, m); S = zeros(n, n); for i = 1 : m S
m
行向量集合,每个行向量的大小n
,排列在一个mxn矩阵中;称之为X
我还有一个m大小的权重向量,w
我想计算由X
中向量的自外积形成的矩阵的加权和
以下是一个MWE,使用for
循环:
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
这可能是最快的方法:
S = X' * bsxfun(@times, X, w(:));
你也可以这样做
S = squeeze(sum(bsxfun(@times, ...
bsxfun(@times, conj(X), permute(X, [1 3 2])), w(:)), 1));
(如果不需要,也可以移除复合共轭物)。这里可以使用两种方法,一种是调用,另一种是和调用。重塑技巧基本上允许我们使用有效的
矩阵乘法
,从而避免我们可能需要的任何额外的bsxfun
调用
方法#1
进近#2
答案最短,也可能最快: S=X'*diag(W)*X
将其用于无气味卡尔曼滤波器,效果很好。问题清楚,MWE:+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
[m1,n1] = size(X);
XXmult = bsxfun(@times,permute(X,[2 3 1]),permute(X,[3 2 1]));
S = reshape(reshape(XXmult,[],m1)*w(:),n1,[])