有没有办法通过这种操作来提高性能?
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
在这些情况下,我想不出任何避免循环的方法。
感谢任何帮助。
答案 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会计算矩阵中的所有组合。
更新
使用bsxfun
和times
可以将速度提高约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);