matlabavg函数,matlab编程基础(函数).ppt
matlab编程基础(函数).ppt
1,数学软件 Matlab, Matlab 编程(函数),2,本讲主要内容,什么是函数⽂件 如何编写函数⽂件 递归函数 函数参数的可调性 局部变量与全局变量 ⼦函数 函数句柄、内联函数、匿名函数,3,M ⽂件根据调⽤⽅式的不同可以分为两类:,Script:脚本⽂件/命令⽂件,Function:函数⽂件,Matlab 编程,直接输⼊⽂件名即可运⾏,供其它M⽂件调⽤,通常带输⼊参数和输出参数,4,function 输出形参列表=函数名(形参列表) %注释说明部分(可选) 函数体语句(必须),第⼀⾏为引导⾏,表⽰该 M⽂件是函数⽂件 函数名的命名规则与变量名相同 ( 必须以字母开头 ) 当输出形参多于⼀个时,⽤⽅括号括起来,函数⽂件,函数⽂件⼀般格式,函数⽂件名必须与函数名⼀致 函数必须是⼀个单独的 M⽂件,5,函数⽂件(f2cf.m):,例:将华⽒温度转化为摄⽒温度:,编程⽰例,clear; f=input(Please input f:); c=5*(f-32)/9; fprintf(c = %gn,c);,脚本⽂件(f2cs.m):,function c = f2cf(f) c=5*(f-32)/9; fprintf(c = %gn,c);,6,函数⽂件举例,function a,b = myswap(x,y) % swap x and y a = y; b = x;,例:交换两个变量的值 myswap.m,有两个输⼊参数和两个输出参数,7,function printyh(n) % 打印杨辉三⾓形, 本函数没有输出参数 yh = 1; disp(yh); if n=1, return; end yh = 1,1; disp(yh); for k = 3 : n yh_old = yh; k2 = ceil(k/2); for i = 2 : k2 yh(i) =
c语言用递归函数求n的阶乘yh_old(i-1) + yh_old(i); end yh(k2+1:k) = yh(k-k2:-1:1); disp(yh); end,函数⽂件举例,例:打印杨辉三
⾓形 printyh.m,没有输⼊参数和输出参数,8,函数调⽤的⼀般格式,输出实参列表=函数名(输⼊实参列表),函数调⽤时,实参的顺序应与函数定义时形参的顺序⼀致 实参与形参之间的结合是通过值传递实现的 函数可以嵌套调⽤,即⼀个函数可以被其它函数调⽤, 甚⾄可以被它⾃⾝调⽤,此时称为递归调⽤ 函数所传递的参数具有可调性,Matlab ⽤两个永久变量 nargin 和 nargout 分别记录调⽤该函数时的输⼊实参 和输出实参的个数,函数调
⽤,9,% 函数⽂件 myfactor.m function y=myfactor(n) if (n=1) y=1; else y=n*myfactor(n-1); end,例:利⽤函数的递归调⽤计算 n!,递归函数举例,10,% main.m % clear; s = 0; n = 10; for i = 1 : n s = s + myfactor(i); end fprintf( s=%g n,s),例:计算 1! + 2! + + 10!,递归函数举例,11,% ex4nargin.m function y = ex4nargin(a,b) if (nargin=1) y = a; elseif (nargin=2) y = a*b; end,参数的可调性举例,例:nargin 和 nargout 的使⽤,% ex4nargout.m function p,q=ex4nargout(a,b) if (nargout=1) p = a + b; elseif
(nargout=2) p = a + b; q = a - b; end,12,函数通过输⼊和输出参数与其它 M ⽂件进⾏数据传递,当函数调⽤完毕后,该函数⽂件中定义的所有局部变量都将被释放,即全部被清除,如果在若⼲个 M⽂件中,都把某个变量定义为全局变量,则这些函数将公共使⽤这⼀变量。所有函数都可以对它进⾏存取和修改操作,函数⽂件中的变量都是局部的,即⼀个函数⽂件中定义的变量不能被另⼀个函数⽂件或其它 M ⽂件使⽤,局部变量与全局变量,定义全局变量是 M⽂件间传递信息的⼀种⼿段,13,变量
名列表中的各个变量⽤空格隔开,不能⽤逗号! 在使⽤全局变量的所有M⽂件中,都要对其所使⽤的全局变量进⾏定义,全局变量给函数间的数据传递带来了⽅便,但却破坏了函数对变量的封装,降低了程序的可读性,因⽽在结构化程序设计中,全局变量是不受欢迎的。特别是当程序较⼤,⼦程序较多时,全局变量将个程序调试和维护带来不便,故不提倡使⽤全局变量。,global 变量名列表,全局变量的定义,全局变量的定义,14,程序⽰例,% ex4global.m clear; global a b a = 1; b = 3; y = mysquaresum(a,b); fprintf( a=%g, b=%g n,a,b); z = myproduct(a,b); fprintf( a=%g, b=%gn,a,b);,% mysquaresum.m function square_sum = mysquaresum(x,y) square_sum = x2 + y2; a = x+y;,% myproduct.m function product = myproduct(x,y) global a product = x*y; a = x+y;,15,⼦函数,⼀个函数⽂件中可以含有⼀个或多个函数, 其中第⼀个称为主函数,其它函数称为⼦函数 ⼦函数由 function 语句引导 除了⽤ global 定义的全局变量外,所有函数中的变量都是局部变量,函数之间通过输⼊、输出参数进⾏数据传递,调⽤⼀个函数时,Matlab 会⾸先检查该函数是否为⼀个⼦函数,主函数必须位于最前⾯,⼦函数出现的次序任意 ⼦函数只能被主函数和位于同⼀个函数⽂件中的其它⼦函数调⽤,16,⼦函数举例,% ex4subfun.m function avg, med =
ex4subfun(x) % 主函数 n = length(x); avg = mean(x, n); med = median(x, n); function a = mean(x, n) % ⼦函数,计算平均值 a = sum(x)/n; function m = median(x, n) % ⼦函数,计算中值 x = sort(x); if rem(n, 2) = 1 m = x(n+1)/2); else m =
(x(n/2)+x(n/2+1)/2; end,17,函数句柄,函数句柄的定义,fhandle = 函数名,函数句柄,可以理解成⼀个函数的代号或别名,调⽤函数句柄就等价于调⽤该函数。, 的作⽤就是将⼀个函数的函数句柄赋值给左边的变量,例:,f = sin; y = f(pi/3),18,内联函数,内联函数的定义,函数名=inline(函数表达式, 变量1, 变量2,.),MATLAB中的内联函数借鉴了C语⾔中的内联函数,使⽤内联函数可以减少调⽤的时间和空间开销。,由于内联函数是储存于内存中⽽不是在M⽂件中,省去了⽂件访问的时间,加快了程序的运⾏效率。 但内联函数只能定义⼀些简单的函数表达式。,例:,f = inline(x2 + y2,x,y); y = f(2,3),19,匿名函数,匿名函数的定义,fhandle = (输⼊参数列表)运算表达式,例:,f = (x,y) x2 + y2; y = f(2,3),匿名函数(anonymous function)是 MATLAB 7.0 版提出的⼀种全新的函数描述形式,和内联函数类似,可以让⽤户编写简单的函数⽽不需要创建M⽂件,因此,匿名函数具有inline函数的所有优点,并且效率⽐inline函数⾼。,p = 3; q = 5; f = (x,y) xp + yq;,匿名函数⽀持变量替换,20,上机作业,1、兔⼦繁殖问题:( Fibonacci number ) 假设每对兔⼦每⽉⽣出⼀对⼩兔,且新⽣的兔⼦满⼆个⽉后就能⽣育,那么从刚出⽣的⼀对⼩兔算起,12个⽉后总共有多少对兔⼦?三年后呢?试编写⼀个函数计算该题,输⼊为⽉数,输出为兔⼦对数。,2、编写⼀个函数,要求实现以下功能,当输⼊⼀个参数时,输出错误信息,并返回 当输⼊两个或三个参数时,计算它们的阶乘的和,21,数学实验,Matlab ⾃定义函数,22,Matlab ⾃定义函数的五种⽅式,命令⽂件/函数⽂件+ 函数⽂件 :多个 M ⽂件,⾃定义函数的五种⽅式,函数⽂件 + ⼦函数 : ⼀个 M ⽂件,inline : ⽆需 M ⽂件,符号表达式 + subs ⽅式 : ⽆需 M ⽂件,字符串 + subs ⽅式 : ⽆需 M ⽂件,23,%命令/函数⽂件:myfile1.m clear for t=1:10;
y=mylfg(t); fprintf(%4d(1/3) = %6.4fn,t,y); end,%函数⽂件:mylfg.m function y = mylfg(x) y=x(1/3);,函数必须单独写⼀个⽂件!不能与命令⽂件写在同⼀个⽂件中!,⾃定义函数⽅式(⼀),⽅式⼀:命令⽂
件/函数⽂件 + 函数⽂件,24,⾃定义函数⽅式(⼆),%函数⽂件:funtry2.m function =funtry2() for t=1:10 y=lfg2(t);
fprintf(%4d(1/3) = %6.4fn,t,y); end function y=lfg2(x) %⼦函数 y=x(1/3);,函数⽂件中可以定义⼀个或多个⼦函数,此时我们称该函数为主函数,⼦函数只能被主函数或同⼀个函数⽂件中的其它⼦函数调⽤!,⽅式⼆:函数⽂件 + ⼦函数,25,f=inline(函数表达式,变量1,变量2,.),y=f(数值列表),代⼊的数值列表顺序应与定义时的变量名顺序⼀致,例:,⾃定义函数⽅式(三),⽅式三:inline + 命令/函数⽂件,inline 命令可以⽤来定义⼀个内联函数,调⽤⽅式:,26,这种函数定义⽅式是将 f 作为⼀个内部函数调⽤。其特点是:调⽤⽅式最接近于我们平时对函数的定义,使程序更具可读性。同时由于它是基于 Matlab 的数值计算内核的,所以它的运算速度较快,程序更有效率。,这种定义⽅式的
函数的定义,使程序更具可读性。同时由于它是基于 Matlab 的数值计算内核的,所以它的运算速度较快,程序更有效率。,这种定义⽅式的缺点:,定义⼀个内联函数⽤去的内存空间⽐相同条件下其他的⽅法要⼤得多。 该⽅法只能对数值进⾏代⼊,不⽀持符号代⼊,并且对于定义后的函数不能进⾏求导等符号运算。,⾃定义函数⽅式(三),27,⾃定义函数⽅式(三),28,%函数⽂件:function =funtry3() lfg=in
line(x. (1/3); %表达式两端的单引号不可缺少 fid=,w); for t=1:50; y=lfg(t); fprintf(fid,%4d(1/3) = %6.4fn,t,y); end fclose(fid); ezplot(lfg,0,50),diff(lfg,x),⾃定义函数⽅式(三),X,29,注:对于在 syms 中已经定义过符号变量,在 subs 中进⾏替代时,单引号可以省略。但如果在 syms 后⼜被重新定义为其它类型,则必须加单引号,否则不可替换。,syms 定义⼀个符号表达式,⽤ subs 命令调⽤,syms f x %定义符号 f=1/(1+x2); %定义符号表达式,subs(f,x,代替 x 的数值或符号),⾃定义函数⽅式(四),⽅式四: syms + subs,30,这种函数定义⽅法的⼀个特点是可以⽤符号进⾏替换,该⽅法的缺点也是明显的:由于使⽤符号运算内核,运算速度会⼤⼤降低。,⾃定义函数⽅式(四),31,注:此处 x 的单引号不可省略。本函数⽅式可以代⼊字符,但字符不能参与运算,否则将⾃⾏转化成该字符的ASCII 码运算,这与我们想要的结果可能会⼤相径庭。,直接定义⼀个字符串,⽤ subs 命令完成调⽤。,例:,f=1/(1+x2) % 定义字符串
z=subs(f,x,2) g=subs(f,x,y2),优点:占内存最少,定义格式⽅便⾃由。,⾃定义函数⽅式(五),⽅式五:字符串 + subs,32,subs 命令的⼀种⽐较⽅便的调⽤⽅法:,当所要替代的符号在调⽤前都已经有了数值定义,则可以直接调⽤:subs(f),例:,⾃定义函数⽅式(五),关于 subs 的⼀个注解
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论