Performance 矢量化双环-MATLAB
我有一个双回路,效率很低Performance 矢量化双环-MATLAB,performance,matlab,vectorization,Performance,Matlab,Vectorization,我有一个双回路,效率很低 c is a [400,2000] matrix r is a [2000,1] matrix P is a [2000,1] matrix S is a [1, 400] matrix for i=1:400 for k=1:2000 c(i,k) = r(k,1) * max([0, P(k,1) - S(1,i)]); end end 我试着做一个parfor,结果成功了。但我在寻找一个更优雅的解决方案。我一直在尝试,但没有运
c is a [400,2000] matrix
r is a [2000,1] matrix
P is a [2000,1] matrix
S is a [1, 400] matrix
for i=1:400
for k=1:2000
c(i,k) = r(k,1) * max([0, P(k,1) - S(1,i)]);
end
end
我试着做一个parfor,结果成功了。但我在寻找一个更优雅的解决方案。我一直在尝试,但没有运气…因为您只执行元素操作,如
-
和*
,这需要使用
使用
进行元素相减p(k,1)-S(1,i)
。输出将是一个[2000400]
矩阵。您可以在此矩阵上应用max(0,…)
操作,最后再次使用bsxfun
将每一行乘以相应的r
:
bsxfun(@times,max(bsxfun(@minus,P,S),0),r)
由于您的c
的大小应该是[4002000]
,添加最后一个转置操作,您就完成了
c = bsxfun(@times,max(bsxfun(@minus,P,S),0),r).';
一个小时间比较:for循环需要
Elapsed time is 0.688408 seconds.
而bsxfun
解决方案只需要
Elapsed time is 0.007884 seconds.
对于完全相同的结果,这是一个很好的加速87。工作完美。非常感谢你。
Elapsed time is 0.007884 seconds.