我编了一个matlab函数,感觉速度很慢,不知道有没有提升速度的办法,希望各位大神指点。贡献小弟所有金币

主函数是yiwei1cen, 有两个子函数f11,f1,其中m()和n()相当于两组权系数,由于字符太多我就省略他们了,运行一次要17秒左右,感觉有点慢,特别是t上加循环以后,很慢很慢,请问有什么地方可以改进的
function y=yiwei1cen(t,a)
m(1)=3.25931063799538E-09;



m(250)=4.30325980609608E-13;
mm=1;
for nn=-149:100
mid(mm)=f1(nn,t,a)*m(mm);
mm=mm+1;
end
mid1=sum(mid);
y=-1*sqrt(2/pi)*mid1/t;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function r=f11(nn,ii,t,a)
syms A s dt;
A=-3.05078187595;
s=1.10599010095e-1;
dt=log(10)/20;
u0=4*pi*10^(-7);
w=exp(nn*dt)/t;
ld=10^(A+(ii-1)*s)/a;
r=u0*ld/(u0+sqrt(ld^2+j*w*u0));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function r=f1(nn,t,a)
syms A s dt;
A=-3.05078187595;
s=1.10599010095e-1;
dt=log(10)/20;
n(1)=3.17926147465e-6 ;



n(47)=7.88229202853e-6;
for ii=1:47
mid(ii)=f11(nn,ii,t,a)*n(ii);
end
mid1=sum(mid);
w=exp(nn*dt)/t;
r=imag(j*w*mid1)/w;
end

1. 这个慢的根本原因是因为你用了matlab符号计算~可以把函数f1和f11里的第一句话syms A s dt;先注释掉,试试看,这样速度肯定会变快很多~就是不知道能否满足你的计算精度要求~

2. 另外你的m和n是不变的系数向量,你没必要把他们写在函数里面,因为这样每次调用函数都得赋值一遍~你可以把m和n的定义写在主函数里面,然后传递给函数f1和f11,这样m和n就都只定义了一遍~应该也是会有所帮助的~
另外如1楼所说的,你不要一个一个元素给向量赋值,可以一起写~这个形式上会比较好,对速度提升帮助应该不是很大~

总结来讲,慢的主要因素是因为第一条,但是如果你一定要用符号计算来达到很高的精度的话那这条就没办法改了~第二条是肯定可以改的,而且必然会有一定的帮助(不一定很大,因为主要因素是第一点)~追问

太感谢您了,果真快了很多很多,从16s到0.16s了,这些我一点都不知道诶,您可不可以给我提供一些说这些的教程了啊,谢谢您了,我邮箱[email protected],您太厉害了,佩服啊。。。。。呵呵呵呵

追答

呃,这些东西matlab用多了就慢慢知道了~最好的教程应该就是matlab的help吧~可以多看看help~

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-12
你把
——————————————————————
m(1)=3.25931063799538E-09;



m(250)=4.30325980609608E-13;
————————————————————————

————————————————————
n(1)=3.17926147465e-6 ;



n(47)=7.88229202853e-6;
——————————————————————————
改成:m=[3.25931063799538E-09;...;4.30325980609608E-13];
n=[3.17926147465e-6 ;...;7.88229202853e-6];
即可。
数组一个个赋值最耗时间。追问

没有啊,我重新做了以后速度没变啊

追答

恩,我想得太简单了。 二楼说的有道理。

第2个回答  2012-09-13
你先测下事件 看看耗时最长的是在哪 ,我觉得应该是在sqrt处 如果对精度要求不高了话 使用查找表
相似回答