第五章自定义函数的计算函数的创建1.用M文件functionf=fun(x)f=1./(1+x.^2);2.内联函数y=inline('(3*x^2-1)/2','x');3.字符串表达式(函数)'theta=t/2,y=sin(theta)‘4.符号函数5.1字符串数组一、字符串入门【例1】先实际操作本例,以体会数值量与字符串的区别。cleara=12345.6789class(a)a_s=size(a)a=1.2346e+004ans=doublea_s=11b='S'class(b)b_s=size(b)b=Sans=charb_s=11whosNameSizeBytesClassa1x18doublearraya_s1x216doublearrayans1x48chararrayb1x12chararrayb_s1x216doublearray【例2】本例演示:串的基本属性、标识和简单操作。(1)创建串数组a='Thisisanexample.'a=Thisisanexample.(2)串数组a的大小size(a)ans=119(3)串数组的元素标识a14=a(1:4)ra=a(end:-1:1)a14=Thisra=.elpmaxenasisihT【例3】中文字符串数组A='这是一个算例。';A_s=size(A)A56=A([56])A_s=17A56=算例【例4】由小串构成大串b='Example''3.1.2-1'''b=Example'3.1.2-1'ab=[a(1:7),'',b,'.']ab=ThisisExample'3.1.2-1'.二、复杂串数组的创建【例1】多行串数组的直接输入示例。clearS=['Thisstringarray''hasmultiplerows.']S=Thisstringarrayhasmultiplerows.size(S)ans=218【例2】演示:用专门函数char,str2mat,strvcat创建多行串数组示例。S1=char('Thisstringarray','hastworows.')S1=Thisstringarrayhastworows.S2=str2mat(‘这’,‘字符’,‘串数组’,‘’,'由4行组成')S2=这字符串数组由4行组成S3=strvcat('这','字符','串数组','','由4行组成')5.2串演算函数为了提高计算的灵活性,MATLAB提供了一种利用字符串进行计算的能力。利用字符串可以构成函数,可以在运行中改变所执行的指令,可以被泛涵指令调用实现比较复杂的求零点、求极值等运算。一、evaly=eval(‘CEM’)[y1,y2,…]=eval(‘CEM’)注:(1)eval指令的输入宗量必须是字符串。(2)构成字符串的CEM,可以是MATLAB任何合法的指令、表达式、语句、或M文件名。(3)第二种格式中的CEM只能是(包含输入宗量在内的)M函数文件名。【例】计算“语句”串,创建变量。clear,t=pi;eval('theta=t/2,y=sin(theta)');theta=1.5708y=1【例】计算“表达式”串,产生向量值。clear,t=pi;cem='[t/2,t*2,sin(t)]';y=eval(cem)y=1.57086.28320.0000【例】计算“替代”串。A=ones(2,1);B=ones(1,3);c=eval('B*A','A*B'),errmessage=lasterrc=111111errmessage=Errorusing==*Innermatrixdimensionsmustagree.【例】计算“合成”串。CEM={'cos','sin','tan'};fork=1:3theta=pi*k/12;y(1,k)=eval([CEM{1},'(',num2str(theta),')']);endyy=0.96590.86600.7071[y1,y2,…]=feval(F,arg1,arg2,…)F可以是函数句柄,函数名字符串,内联函数feval与函数句柄配套使用【例】对字符串类型函数只能用eval,而不能用feval。x=pi/4;Ve=eval('1+sin(x)')Ve=1.7071Vf=feval('1+sin(x)',x)???Errorusing==fevalInvalidfunctionname'1+sin(x)'.二、feval【例】函数句柄只能被feval运用,而不能被eval调用。(1)函数句柄被feval调用rand('seed',1);A=rand(2,2);Heig=@eig;d=feval(Heig,A)d=0.7568-0.1488(2)eval不能对函数句柄进行操作de=eval(Heig,A)???Errorusing==evalFunction'eval'notdefinedforvariablesofclass'function_handle'.(3)feval能对函数名字符串进行操作dn=feval('eig',A)dn=0.7568-0.1488dn=feval('sin',pi/2)dn=1【例】feval和eval调用区别:feval的FN只接受函数名。本例两种方法以后者为好。randn('seed',1);A=rand(2,2);[ue,de,ve]=eval('svd(A)');disp('Resultsbyeval');disp([ue,de,ve]);disp(blanks(1))[uf,df,vf]=feval('svd',A);disp('Resultsbyfeval');disp([uf,df,vf])Resultsbyeval-0.9193-0.39361.22120-0.7897-0.6135-0.39360.919300.2633-0.61350.7897Resultsbyfeval-0.9193-0.39361.22120-0.7897-0.6135-0.39360.919300.2633-0.61350.7897三、内联函数inline('CE')inline('CE',arg1,arg2,…)inline('CE',n)注:(1)‘CE’字符串,CE必须是不包含赋值号‘=’的表达式。(2)内联函数是沟通eval,feval两个不同指令的桥梁。凡eval可以运作的表达式,都可以通过inline转化为内联函数,而这种内联函数总可以被feval使用。(3)第三种调用格式最简练,但对输入宗量的字符限制严格。输入宗量的字符只能是x,P1,P2,…,Pn.(2)使适应数组运算规则GG=vectorize(G)GG=Inlinefunction:GG(a,x,y)=a.*exp(x).*cos(y)GG(2,[1,2],[pi/3,pi])ans=2.7183-14.7781【例】用内联函数对象实现。(1)创建带一个参量的二元函数G=inline('a*exp(x)*cos(y)','a','x','y');【例】演示:内联函数的第一种创建格式;使内联函数适于“数组运算”。clear,F1=inline('sin(rho)/rho')F1=Inlinefunction:F1(rho)=sin(rho)/rhof1=F1(2)f1=0.4546FF1=vectorize(F1)xx=[0.5,1,1.5,2];ff1=FF1(xx)FF1=Inlinefunction:FF1(rho)=sin(rho)./rhoff1=0.95890.84150.66500.4546【例】演示:产生向量输入、向量输出的内联函数;这种向量函数的调用方法。Y2=inline('[x(1)^2;3*x(1)*sin(x(2))]')argnames(Y2)Y2=Inlinefunction:Y2(x)=[x(1)^2;3*x(1)*sin(x(2))]ans='x'x=[4,pi/6];y2=Y2(x)y2=16.00006.0000【例】演示:最简练格式创建内联函数;内联函数可被feval指令调用。Z2=inline('P1*x*sin(x^2+P2)',2)Z2=Inlinefunction:Z2(x,P1,P2)=P1*x*sin(x^2+P2)z2=Z2(2,2,3)fz2=feval(Z2,2,2,3)z2=2.6279fz2=2.62795.3函数句柄引入函数句柄使“函数调用”像“变量调用”一样灵活方便。一、函数句柄的创建(1)利用@符号(2)利用转换函数str2func【例】为MATLAB的“内建”函数创建函数句柄,并观察其内涵。(1)创建函数句柄hsin=@sin;(2)类型判别class(hsin)size(hsin)ans=function_handleans=11二、函数句柄的基本用法[ao1,ao2,…,aon]=FunName(ai1,ai2,…,ain)Hfun=@FunName;[ao1,ao2,…,aon]=feval(Hfun,ai1,ai2,…,ain)【例】本例通过sin函数及其句柄演示若干基本用法。(1)函数句柄的创建fhandle=str2func('sin');(2)函数句柄在“数值计算”中的情况ys=sin(pi/4)yfold=feval('sin',pi/4)yfnew=feval(fhandle,pi/4)ys=0.7071yfold=0.7071yfnew=0.7071(3)函数句柄在“符号计算”中的情况Alpha=sym('pi/4');yss=sin(Alpha)yfold=feval('sin',Alpha)ynews=feval(fhandle,Alpha)yss=1/2*2^(1/2)yfold=1/2*2^(1/2)ynews=1/2*2^(1/2)(4)函数句柄在泛函指令中的用法在[0,2π]间求sin函数的极小值点的位置。xold=fminbnd('sin',0,2*pi)xnew=fminbnd(fhandle,0,2*pi)xold=4.7124xnew=4.7124【例】自建函数及其句柄的使用。通过本例可看到:只要在当前MATLAB工作空间中存在函数句柄,那末不管该函数当前是否在搜索范围内,均可通过函数句柄实现正确的运作。(1)[zzy076_3.m]functionHr=zzy076_3(flag)%ZZY076_3为演示函数、子函数句柄而设计的绘图文件。%flag可以取字符串'line'或'circle'。t=(0:100)/100*2*pi;x=sin(t);y=cos(t);Hr=@cirline;%创建子函数的句柄feval(Hr,flag,x,y,t)%-------------subfunction---------------------functioncirline(wd,x,y,t)%wd接受字符串'line'或'circle'%t画线用的独立参变量%x由t产生的横坐标变量%y由t产生的纵坐标变量switchwdcase'line'plot(t,x,'b',t,y,'r','LineWidth',2)case'circle'plot(x,y,'g.','MarkerSize',30),axissquareoffotherwiseerror('输入宗量只能取''line''或''circle''!')endshg(2)Hzzy076_3=@zzy076_3zzy076_3('line');Hzzy076_3=@zzy076_301234567-1-0.8-0.6-0.4-0.200.20.40.60.81HCL=zzy076_3('circle')HCL=@cirline【例】用简单算例演示subs的置换规则。symsx;f=2*sin(x)+5;f2=subs(f,{x},{pi/3})f2=6.73215.4符号函数