【发布时间】: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
有没有办法通过这种操作提高性能?
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
好的 ol' 矩阵乘法怎么样?
a = exp(-l.'*t);
【讨论】:
.',检查doc transpose,对于*,检查doc mtimes。
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)); 行,值得一读。如果单击它,则会解释预分配。
【讨论】:
a(numel(l),numel(t))=0;,因为预分配也需要时间,您可以看到这如何改变整体性能的结果。请参阅此处进行更深入的讨论...stackoverflow.com/questions/14169222/…
zeros 或nan 可以改进预分配。我正在阅读,谢谢。
这是使用meshgrid的一种方式:
[t l]=meshgrid(0:0.01:100,0.1:0.5:100);
c=exp(-t.*l);
【讨论】: