我有一个双循环,这是非常低效的。
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并且它有效。但我一直在寻找更优雅的解决方案。我一直在努力尝试但没有运气......
答案 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.