Vectorize Double Loop - MATLAB

时间:2015-12-05 11:47:09

标签: 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并且它有效。但我一直在寻找更优雅的解决方案。我一直在努力尝试但没有运气......

1 个答案:

答案 0 :(得分:8)

由于您只进行了元素操作,class java.lang.String It is not equal PING. It is:<PING> RECEIVED: PING -,因此需要使用bsxfun进行解决方案。

使用

.*

进行逐元素减法bsxfun(@minus,P,S) 。输出将是P(k,1) - S(1,i)矩阵。您可以对此矩阵应用[2000,400]操作,最后再次使用max(0,...)将每行乘以相应的bsxfun

r

由于您的bsxfun(@times,max(bsxfun(@minus,P,S),0),r) 大小应为c,请添加最终的转置操作,然后您就完成了。

[400,2000]

小时间比较:for循环需要

c = bsxfun(@times,max(bsxfun(@minus,P,S),0),r).';

Elapsed time is 0.688408 seconds. 解决方案只需

bsxfun

对于完全相同的结果,这是一个很好的加速87.