在 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)。
谢谢!
您可以使用 bsxfun
和 matrix-multiplication
-
A = bsxfun(@times,Z,hazard).'*Z + A
仅使用矩阵乘法:
A = A + Z'*diag(hazard)*Z;
但是请注意,这需要比 更多的操作,因为 diag(hazard)
是一个主要由零组成的 N
xN
矩阵。
为了节省一些时间,您可以使用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
的方法始终更快。
为了加快我的 Matlab 代码速度,我想对乘积之和进行矢量化。有可能吗?
for i=1:N
A=A+hazard(i)*Z(i,:)'*Z(i,:);
end
其中 hazard
是向量 (N x 1),Z
是矩阵 (N x p)。
谢谢!
您可以使用 bsxfun
和 matrix-multiplication
-
A = bsxfun(@times,Z,hazard).'*Z + A
仅使用矩阵乘法:
A = A + Z'*diag(hazard)*Z;
但是请注意,这需要比 diag(hazard)
是一个主要由零组成的 N
xN
矩阵。
为了节省一些时间,您可以使用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
的方法始终更快。