【问题标题】:Vectorize Double Loop - MATLAB向量化双循环 - MATLAB
【发布时间】:2015-12-05 11:47:08
【问题描述】:

我有一个双循环,效率很低。

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,它奏效了。但我一直在寻找更优雅的解决方案。我一直在尝试,但没有运气......

【问题讨论】:

    标签: performance matlab vectorization


    【解决方案1】:

    由于您只进行元素操作,如 -.*,这需要使用 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],所以添加一个最终的转置操作,你就完成了。

    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。

    【讨论】:

    • 完美运行。非常感谢。
    猜你喜欢
    • 2015-07-06
    • 2013-02-18
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多