【问题标题】:improve loop performance in MATLAB提高 MATLAB 中的循环性能
【发布时间】:2014-07-13 08:35:13
【问题描述】:

有没有办法通过这种操作提高性能?

t=0:0.01:100;
f=@(t,l) exp(-t.*l)
l=[0.1:0.5:100];
for ll=1:length(l)
    a(ll,:)=f(t,l(ll));
end 

在这些情况下,我想不出任何方法来避免循环。

感谢任何帮助。

【问题讨论】:

    标签: arrays performance matlab optimization vectorization


    【解决方案1】:

    好的 ol' 矩阵乘法怎么样?

    a = exp(-l.'*t);
    

    【讨论】:

    • 当然... +1 我想知道 bsxfun 是否仍然更快。
    • @Daniel 在我的计算机上,对于长度为 3000 的两个输入向量,此解决方案的速度大约快 4 倍(您的解决方案为 0.7s,此解决方案为 0.175s)。
    • 你能提供一些关于A.'*B符号组合的使用参考吗?
    • @Vaaal:对于.',检查doc transpose,对于*,检查doc mtimes
    【解决方案2】:
    t=0:0.01:100;
    l=[0.1:0.5:100];
    b=bsxfun(@(a,b)exp(-a.*b),t,l.')
    

    对于使用行向量和列向量的简单情况,bsxfun 计算矩阵中的所有组合。


    更新:

    使用bsxfuntimes 可以将速度提高大约4 倍。这更快,因为对于一些基本的数学运算,bsxfun 有一个高度优化的实现。

    t=0:0.01:100;
    l=[0.1:0.5:100];
    b=exp(bsxfun(@times,-t,l.'))
    

    第三种解决方案,非常简单,几乎与我改进的或 natas 解决方案一样快。只需预先分配a

    t=0:0.01:100;
    f=@(t,l) exp(-t.*l)
    l=[0.1:0.5:100];
    a=nan(numel(l),numel(t));
    for ll=1:length(l)
        a(ll,:)=f(t,l(ll));
    end 
    

    Matlab 应该在编辑器中用黄色警告标记a(ll,:)=f(t,l(ll)); 行,值得一读。如果单击它,则会解释预分配。

    【讨论】:

    • 首先,在 bsxfun 上 +1,我一直很喜欢人们传播信息。其次,更快的预分配将是a(numel(l),numel(t))=0;,因为预分配也需要时间,您可以看到这如何改变整体性能的结果。请参阅此处进行更深入的讨论...stackoverflow.com/questions/14169222/…
    • @natan:从未想过使用zerosnan 可以改进预分配。我正在阅读,谢谢。
    【解决方案3】:

    这是使用meshgrid的一种方式:

    [t l]=meshgrid(0:0.01:100,0.1:0.5:100);
    c=exp(-t.*l);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 2018-11-08
      • 1970-01-01
      • 2014-07-27
      相关资源
      最近更新 更多