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.