在 MATLAB 中乘以标量的外积之和

Sum of outer products multiplied by a scalar in MATLAB

为了加快我的 Matlab 代码速度,我想对乘积之和进行矢量化。有可能吗?

for i=1:N
    A=A+hazard(i)*Z(i,:)'*Z(i,:);
end

其中 hazard 是向量 (N x 1),Z 是矩阵 (N x p)。

谢谢!

您可以使用 bsxfunmatrix-multiplication -

A =  bsxfun(@times,Z,hazard).'*Z + A

仅使用矩阵乘法:

A = A + Z'*diag(hazard)*Z;

但是请注意,这需要比 更多的操作,因为 diag(hazard) 是一个主要由零组成的 NxN 矩阵。

为了节省一些时间,您可以使用spdiags将内部矩阵定义为sparse,这样可以优化乘法:

A = A + full(Z'*spdiags(hazard, 0, zeros(N))*Z);

基准测试

时间码:

Z = rand(N,p);
hazard = rand(N,1);
timeit(@() Z'*diag(hazard)*Z)
timeit(@() full(Z'*spdiags(hazard, 0, zeros(N))*Z))
timeit(@() bsxfun(@times,Z,hazard)'*Z)

N = 1000; p = 300;

ans =
    0.1423
ans =
    0.0441
ans =
    0.0325

N = 2000; p = 1000;

ans =
    1.8889
ans =
    0.7110
ans =
    0.6600

N = 1000; p = 2000;

ans =
    1.8159
ans =
    1.2471
ans =
    1.2264

可以看出,基于 bsxfun 的方法始终更快。