外部产品的总和乘以MATLAB中的标量

时间:2015-05-21 14:29:01

标签: performance matlab vectorization product outer-join

我想在此后对产品的总和进行矢量化,以加快我的Matlab代码。会不可能?

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

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

谢谢!

2 个答案:

答案 0 :(得分:5)

您可以使用bsxfunmatrix-multiplication -

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

答案 1 :(得分:5)

仅使用矩阵乘法:

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

但请注意,这需要比Divakar's bsxfun approach更多的操作,因为diag(hazard)是一个N x N矩阵,主要由零组成。

为节省时间,您可以使用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的方法始终更快。