【发布时间】:2015-08-03 07:10:02
【问题描述】:
我想在以后对乘积的总和进行矢量化,以加快我的 Matlab 代码。有可能吗?
for i=1:N
A=A+hazard(i)*Z(i,:)'*Z(i,:);
end
其中hazard 是一个向量 (N x 1),Z 是一个矩阵 (N x p)。
谢谢!
【问题讨论】:
标签: 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)。
谢谢!
【问题讨论】:
标签: performance matlab vectorization product outer-join
仅使用矩阵乘法:
A = A + Z'*diag(hazard)*Z;
但是请注意,这需要比Divakar's bsxfun approach 更多的操作,因为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 的方法始终更快。
【讨论】:
A 可能吗?
timeit。基于bsxfun 的方法在我的计算机上似乎要快得多。查看我的时间(我已经编辑了我的答案)
您可以使用bsxfun 和matrix-multiplication -
A = bsxfun(@times,Z,hazard).'*Z + A
【讨论】:
repmat(hazard,1,p).*Z,但是bsxfun 有什么不情愿的呢?
bsxfun 的方法都更快