在MATLAB中改善循环性能

时间:2014-05-23 21:17:47

标签: arrays performance matlab optimization vectorization

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

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 

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

感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

好的ol'矩阵乘法?

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

答案 1 :(得分:4)

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));,值得一读。如果单击它,则说明预分配。

答案 2 :(得分:3)

这是使用meshgrid的方法:

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