没有想到能够引来大家发表了这么多议论,先谢谢大家的参与。我挺赞同楼上说的一句话“有时,优化时间可能比计算时间付出更大的代价”,我也一直在想办法优化程序,在某些方面取得了一些效果,但是有碰到了很多的问题。我的问题主要是在循环调用程序积分方面的,自己也尝试过优化,下面把心得说一下,希望能对大家有所帮助,有不对之处请指正!
积分表达式a*x+1,其中a为变量,求a为1~1000时的积分值。
1)直接调用M子函数
Elapsed time is 0.486639 seconds. 2)function handle
Elapsed time is 0.467544 seconds.
3)匿名函数
Elapsed time is 0.213994 seconds.
4)inline function
fi=inline('a*x + 1', 'x','a');
Elapsed time is 0.457284 seconds.
5)quadv命令调用子函数
quadv(@(x)fm(x,a),0,1);
%0.002s
Elapsed time is 0.037595 seconds.
6)quadv命令调用匿名函数
quadv(@(x)f(x,a),0,1);
%0.002s Elapsed time is 0.034381 seconds.
这个是我自己做的一些比较,跟网上的一篇文章有些类似。可以看到使用quadv命令的速度是最快的(注意:quadv的两个程序a取值到了10000!),quadv命令应该就是矢量化的一种表现吧。使用quadv命令的同时,使用匿名函数又略微快一些,当子函数定义比较复杂带有很多变量传递时,这种差别格外明显。
我的问题可以这样表达:上述程序6)为一个子程序,主程序通过循环把变量传递给子程序进行积分计算,当计算量很大时(循环比较大),profile发现主要占用时间产生自匿名函数f的定义上,quadv命令反而没有占用那么多时间,这个有没有什么办法解决?
上述的这个问题速度上其实也能够接受,但是要是二重积分碰到这个问题呢?二重积分有没有quadv类似的命令呢?
请大家指点! |