Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中矩阵加权和的矢量化_Matlab_For Loop_Matrix_Sum_Vectorization - Fatal编程技术网

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

我试图在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 = 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,[])