matlab编程基础(函数)

上传人:s9****2 文档编号:577703496 上传时间:2024-08-22 格式:PPT 页数:32 大小:299.02KB
返回 下载 相关 举报
matlab编程基础(函数)_第1页
第1页 / 共32页
matlab编程基础(函数)_第2页
第2页 / 共32页
matlab编程基础(函数)_第3页
第3页 / 共32页
matlab编程基础(函数)_第4页
第4页 / 共32页
matlab编程基础(函数)_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《matlab编程基础(函数)》由会员分享,可在线阅读,更多相关《matlab编程基础(函数)(32页珍藏版)》请在金锄头文库上搜索。

1、数学软件数学软件 Matlab Matlab 编程(函数)1本讲主要内容本讲主要内容n 什么是函数文件什么是函数文件n 如何编写函数文件如何编写函数文件n 递归函数递归函数n 函数参数的可调性函数参数的可调性n 局部变量与全局变量局部变量与全局变量n 子函数子函数n 函数句柄、内联函数、匿名函数函数句柄、内联函数、匿名函数2q M 文件根据调用方式的不同可以分为两类:文件根据调用方式的不同可以分为两类:l Script:脚本文件脚本文件/命令文件命令文件 l Function:函数文件函数文件 Matlab 编程编程l 直接输入直接输入文件名文件名即可运行即可运行l 供其它供其它M文件调用,通

2、常带输入参数和输出参数文件调用,通常带输入参数和输出参数3function 输出形参列表输出形参列表=函数名函数名(形参列表形参列表)% 注释说明部分注释说明部分(可选可选)函数体语句函数体语句(必须必须)l 第一行为第一行为引导行引导行,表示该,表示该 M文件是函数文件文件是函数文件l 函数名的命名规则与变量名相同函数名的命名规则与变量名相同 ( 必须以字母开头必须以字母开头 )l 当当输出形参输出形参多于一个时,用多于一个时,用方括号方括号括起来括起来函数文件函数文件q 函数文件一般格式函数文件一般格式l 函数函数文件名必须与函数名一致文件名必须与函数名一致l 函数必须是一个函数必须是一个

3、单独的单独的 M文件文件4l 函数文件函数文件(f2cf.m):例:例:将华氏温度转化为摄氏温度:将华氏温度转化为摄氏温度:编程示例编程示例clear; f=input(Please input f:);c=5*(f-32)/9;fprintf(c = %gn,c);l 脚本文件脚本文件 (f2cs.m):function c = f2cf(f)c=5*(f-32)/9;fprintf(c = %gn,c);5函数文件举例函数文件举例function a,b = myswap(x,y)% swap x and y a = y; b = x;例:例:交换两个变量的值交换两个变量的值 myswap

4、.ml 有两个输入参数和两个输出参数有两个输入参数和两个输出参数6function printyh(n)% 打印杨辉三角形打印杨辉三角形, 本函数没有输出参数本函数没有输出参数yh = 1; disp(yh); if n=1, return; endyh = 1,1; disp(yh);for k = 3 : n yh_old = yh; k2 = ceil(k/2); for i = 2 : k2 yh(i) = yh_old(i-1) + yh_old(i); end yh(k2+1:k) = yh(k-k2:-1:1); disp(yh);end函数文件举例函数文件举例例:例:打印杨辉三

5、角形打印杨辉三角形 printyh.ml 没有输入参数和输出参数没有输入参数和输出参数7q 函数调用的一般格式函数调用的一般格式输出实参列表输出实参列表=函数名函数名(输入实参列表输入实参列表)l 函数调用时,函数调用时,实参的顺序实参的顺序应与函数定义时应与函数定义时形参的顺序形参的顺序一致一致l 实参实参与与形参形参之间的结合是通过之间的结合是通过值传递值传递实现的实现的l 函数可以函数可以嵌套调用嵌套调用,即一个函数可以被其它函数调用,即一个函数可以被其它函数调用, 甚至可以被它自身调用,此时称为甚至可以被它自身调用,此时称为递归调用递归调用l 函数所传递的参数具有可调性,函数所传递的参

6、数具有可调性,Matlab 用两个永久变量用两个永久变量 nargin 和和 nargout 分别记录调用该函数时的输入实参分别记录调用该函数时的输入实参 和输出实参的个数和输出实参的个数函数调用函数调用8% 函数文件函数文件 myfactor.mfunction y=myfactor(n)if (n=1) y=1;else y=n*myfactor(n-1);end例:例:利用函数的递归调用计算利用函数的递归调用计算 n!递归函数举例递归函数举例9% main.m%clear;s = 0;n = 10;for i = 1 : n s = s + myfactor(i);endfprintf(

7、 s=%g n,s)例:例:计算计算 1! + 2! + + 10!递归函数举例递归函数举例10% ex4nargin.mfunction y = ex4nargin(a,b)if (nargin=1) y = a;elseif (nargin=2) y = a*b;end参数的可调性举例参数的可调性举例例:例:nargin 和和 nargout 的使用的使用% ex4nargout.mfunction p,q=ex4nargout(a,b)if (nargout=1) p = a + b;elseif (nargout=2) p = a + b; q = a - b;end11l 函数通过函

8、数通过输入和输出参数输入和输出参数与其它与其它 M 文件进行数据传递文件进行数据传递l 当函数调用完毕后,该函数文件中定义的所有局部变量当函数调用完毕后,该函数文件中定义的所有局部变量都将被释放,即都将被释放,即全部被清除全部被清除q 如果在若干个如果在若干个 M文件中,文件中,都把某个变量定义为全局变量都把某个变量定义为全局变量,则这些函数将公共使用这一变量则这些函数将公共使用这一变量。所有函数都可以对它进所有函数都可以对它进行存取和修改操作行存取和修改操作q 函数文件中的变量都是函数文件中的变量都是局部局部的,即一个函数文件中定义的,即一个函数文件中定义的变量不能被另一个函数文件或其它的变

9、量不能被另一个函数文件或其它 M 文件使用文件使用局部变量与全局变量局部变量与全局变量l 定义全局变量是定义全局变量是 M文件间传递信息的一种手段文件间传递信息的一种手段12l 变量名列表中的各个变量变量名列表中的各个变量用空格隔开用空格隔开,不能用逗号!,不能用逗号!l 在使用全局变量的所有在使用全局变量的所有M文件中,都要对其所使用的全文件中,都要对其所使用的全局变量进行定义局变量进行定义全局变量给函数间的数据传递带来了方便,但却破坏全局变量给函数间的数据传递带来了方便,但却破坏了函数对变量的封装,降低了程序的可读性,因而了函数对变量的封装,降低了程序的可读性,因而在在结构化程序设计中,全

10、局变量是不受欢迎的结构化程序设计中,全局变量是不受欢迎的。特别是。特别是当程序较大,子程序较多时,全局变量将个程序调试当程序较大,子程序较多时,全局变量将个程序调试和维护带来不便,故不提倡使用全局变量。和维护带来不便,故不提倡使用全局变量。global 变量名列表变量名列表全局变量的定义全局变量的定义q 全局变量的定义全局变量的定义13程序示例程序示例% ex4global.mclear; global a ba = 1; b = 3;y = mysquaresum(a,b);fprintf( a=%g, b=%g n,a,b);z = myproduct(a,b);fprintf( a=%g

11、, b=%gn,a,b);% mysquaresum.mfunction square_sum = mysquaresum(x,y)square_sum = x2 + y2; a = x+y;% myproduct.mfunction product = myproduct(x,y)global aproduct = x*y; a = x+y;14子函数子函数l 一个函数文件中可以含有一个或多个函数,一个函数文件中可以含有一个或多个函数, 其中第一个称为主函数,其它函数称为子函数其中第一个称为主函数,其它函数称为子函数l 子函数由子函数由 function 语句引导语句引导l 除了用除了用 g

12、lobal 定义的全局变量外,所有函数中的变量都定义的全局变量外,所有函数中的变量都是局部变量,函数之间通过输入、输出参数进行数据传递是局部变量,函数之间通过输入、输出参数进行数据传递调用一个函数时,调用一个函数时,Matlab 会首先检查该函数是否为一个子会首先检查该函数是否为一个子函数函数l 主函数必须位于最前面,子函数出现的次序任意主函数必须位于最前面,子函数出现的次序任意l 子函数只能被主函数和位于同一个函数文件中的其它子子函数只能被主函数和位于同一个函数文件中的其它子函数调用函数调用15子函数举例子函数举例% ex4subfun.mfunction avg, med = ex4sub

13、fun(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;end16函数句柄函数句柄q 函数句柄的定义函数句柄的定义fhandle = 函数名函数名 函数句柄,函数句柄,可以理解成一

14、个函数的代号或别名,调用函数句柄可以理解成一个函数的代号或别名,调用函数句柄就等价于调用该函数。就等价于调用该函数。l 的作用就是将一个函数的函数句柄赋值给左边的变量的作用就是将一个函数的函数句柄赋值给左边的变量 例:例:f = sin;y = f(pi/3)17内联函数内联函数q 内联函数的定义内联函数的定义函数名函数名=inline(函数表达式函数表达式, 变量变量1, 变量变量2,.) MATLAB中的内联函数借鉴了中的内联函数借鉴了C语言中的内联函数,使用内联语言中的内联函数,使用内联函数可以减少调用的时间和空间开销。函数可以减少调用的时间和空间开销。l 由于内联函数是储存于内存中而不

15、是在由于内联函数是储存于内存中而不是在M文件中,省去了文文件中,省去了文件访问的时间,加快了程序的运行效率。件访问的时间,加快了程序的运行效率。l 但内联函数只能定义一些简单的函数表达式。但内联函数只能定义一些简单的函数表达式。例:例:f = inline(x2 + y2,x,y);y = f(2,3)18匿名函数匿名函数q 匿名函数的定义匿名函数的定义fhandle = (输入参数列表输入参数列表)运算表达式运算表达式例:例:f = (x,y) x2 + y2;y = f(2,3)匿名函数(匿名函数(anonymous function)是)是 MATLAB 7.0 版提出的一版提出的一种全

16、新的函数描述形式,和内联函数类似,可以让用户编写简种全新的函数描述形式,和内联函数类似,可以让用户编写简单的函数而不需要创建单的函数而不需要创建M文件,因此,匿名函数具有文件,因此,匿名函数具有inline函函数的所有优点,并且效率比数的所有优点,并且效率比inline函数高函数高。p = 3; q = 5;f = (x,y) xp + yq;l 匿名函数匿名函数支持变量替换支持变量替换19上机作业上机作业1、兔子繁殖问题:兔子繁殖问题:( Fibonacci number ) 假设假设每对兔子每月生每对兔子每月生出出一对一对小兔,且新生的兔子满二个月小兔,且新生的兔子满二个月后就能生育,后就

17、能生育,那么从刚出生的一对小兔算起,那么从刚出生的一对小兔算起,12个月后总共个月后总共有有多少对兔子?多少对兔子?三年后呢?试编写一个函数计算该题,输入三年后呢?试编写一个函数计算该题,输入为月数,输出为兔子对数。为月数,输出为兔子对数。2、编写一个函数,要求实现以下功能编写一个函数,要求实现以下功能l 当输入一个参数时,输出错误信息,并返回当输入一个参数时,输出错误信息,并返回l 当输入两个或三个参数时,计算它们的阶乘的和当输入两个或三个参数时,计算它们的阶乘的和20数学实验Matlab 自定义函数21q Matlab 自定义函数的五种方式自定义函数的五种方式u 命令文件命令文件/函数文件

18、函数文件+ 函数文件函数文件 :多个多个 M 文件文件自定义函数的五种方式自定义函数的五种方式u 函数文件函数文件 + 子函数子函数 : 一个一个 M 文件文件u inline : 无需无需 M 文件文件u 符号表达式符号表达式 + subs 方式方式 : 无需无需 M 文件文件u 字符串字符串 + subs 方式方式 : 无需无需 M 文件文件22%命令命令/函数文件:函数文件:myfile1.mclearfor t=1:10; y=mylfg(t); fprintf(%4d(1/3) = %6.4fn,t,y);end%函数文件:函数文件:mylfg.mfunction y = mylfg

19、(x)y=x(1/3);函数必须单独写一个文件!函数必须单独写一个文件!不能与命令文件写在同一个文件中!不能与命令文件写在同一个文件中!函数名与文件名必须一致!函数名与文件名必须一致!调用函数时要注意调用函数时要注意实参实参与与形参形参的匹配!的匹配!自定义函数方式(一)自定义函数方式(一)q 方式一方式一:命令文件命令文件/函数文件函数文件 + 函数文件函数文件23自定义函数方式(二)自定义函数方式(二)%函数文件:函数文件:funtry2.m function =funtry2()for t=1:10 y=lfg2(t); fprintf(%4d(1/3) = %6.4fn,t,y);en

20、dfunction y=lfg2(x) %子函数子函数y=x(1/3);函数文件中可以定义一个或多个函数文件中可以定义一个或多个子函数子函数,此时我们称该函,此时我们称该函数为数为主函数主函数,子函数,子函数只能被主函数或同一个函数文件中的被主函数或同一个函数文件中的其它子函数调用!其它子函数调用!q 方式二方式二:函数文件函数文件 + 子函数子函数24f=inline(函数表达式函数表达式,变量变量1 1,变量变量2 2,.)y=f(数值列表数值列表)代入的代入的数值列表数值列表顺序应与定义时的顺序应与定义时的变量名变量名顺序一致顺序一致例:例:自定义函数方式(三)自定义函数方式(三)q 方

21、式三方式三:inline + 命令命令/函数文件函数文件l inline 命令可以用来定义一个命令可以用来定义一个内联函数内联函数l 调用方式:调用方式:25u 这种函数定义方式是将这种函数定义方式是将 f 作为一个内部函数调用。其特作为一个内部函数调用。其特点是:调用方式点是:调用方式最接近于我们平时对函数的定义最接近于我们平时对函数的定义,使程序,使程序更具可读性。同时由于它是基于更具可读性。同时由于它是基于 Matlab 的数值计算内核的,的数值计算内核的,所以它的所以它的运算速度较快运算速度较快,程序更有效率。,程序更有效率。u 这种定义方式的缺点:这种定义方式的缺点:l 定义一个内联

22、函数用去的内存空间比相同条件下其他定义一个内联函数用去的内存空间比相同条件下其他的方法要大得多。的方法要大得多。l 该方法该方法只能对数值进行代入只能对数值进行代入,不支持符号代入,并且,不支持符号代入,并且对于定义后的函数对于定义后的函数不能进行求导等符号运算不能进行求导等符号运算。自定义函数方式(三)自定义函数方式(三)26自定义函数方式(三)自定义函数方式(三)27%函数文件:函数文件:function =funtry3()lfg=inline(x.(1/3); %表达式两端的单引号不可缺少表达式两端的单引号不可缺少fid=fopen(myfile3.txt,w);for t=1:50;

23、 y=lfg(t); fprintf(fid,%4d(1/3) = %6.4fn,t,y);endfclose(fid);ezplot(lfg,0,50)diff(lfg,x)自定义函数方式(三)自定义函数方式(三)X28注:注:对于在对于在 syms 中已经定义过符号变量,在中已经定义过符号变量,在 subs 中进行中进行替代时,单引号可以省略。但如果在替代时,单引号可以省略。但如果在 syms 后又被重新后又被重新定义为其它类型,则必须加单引号,否则不可替换。定义为其它类型,则必须加单引号,否则不可替换。l syms 定义一个定义一个符号表达式符号表达式,用,用 subs 命令调用命令调用

24、syms f x %定义符号定义符号f=1/(1+x2); %定义符号表达式定义符号表达式subs(f,x,代替代替 x 的数值或符号的数值或符号)自定义函数方式(四)自定义函数方式(四)q 方式四方式四: syms + subs29u 这种函数定义方法的一个特点是可以用符号进行替换这种函数定义方法的一个特点是可以用符号进行替换u 该方法的缺点也是明显的:由于使用符号运算内核,该方法的缺点也是明显的:由于使用符号运算内核,运算速度会大大降低。运算速度会大大降低。自定义函数方式(四)自定义函数方式(四)30注:注:此处此处 x 的单引号不可省略。本函数方式可以代入字符,的单引号不可省略。本函数方

25、式可以代入字符,但字符不能参与运算,否则将自行转化成该字符的但字符不能参与运算,否则将自行转化成该字符的 ASCII 码运算,这与我们想要的结果可能会大相径庭。码运算,这与我们想要的结果可能会大相径庭。l 直接定义一个字符串,用直接定义一个字符串,用 subs 命令完成调用。命令完成调用。例:例:f=1/(1+x2) % 定义字符串定义字符串z=subs(f,x,2) g=subs(f,x,y2)优点:占内存最少,定义格式方便自由。优点:占内存最少,定义格式方便自由。自定义函数方式(五)自定义函数方式(五)q 方式五方式五:字符串字符串 + subs31l subs 命令的一种比较方便的调用方法:命令的一种比较方便的调用方法:当所要替代的符号在调用前都已经有了数值定义当所要替代的符号在调用前都已经有了数值定义,则则可以直接调用:可以直接调用:subs(f)例:例:自定义函数方式(五)自定义函数方式(五)u 关于关于 subs 的一个注解的一个注解32

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号