1、第第5章章 MATLAB程序设计程序设计M文件简介文件简介MATLAB程序控制结构程序控制结构函数调用和参数传递函数调用和参数传递 MATLAB有两种工作方式:有两种工作方式:(1)交互式的命令行工作方式)交互式的命令行工作方式 通常通常matlab以以指令驱动模式指令驱动模式工作,即在工作,即在matlab 窗口下当用户输入窗口下当用户输入单行指令单行指令时,时,matlab 立即处理这条指令,并显示结果,这立即处理这条指令,并显示结果,这就是就是matlab命令行方式命令行方式。缺点:缺点:a.命令行操作时,命令行操作时,matlab窗口只允许一次执行窗口只允许一次执行一行上的一个或几个语
2、句。一行上的一个或几个语句。b.命令行方式程序可读性差命令行方式程序可读性差c.不能存储,当处理复杂问题和大量数据时是不能存储,当处理复杂问题和大量数据时是不方便的,应编写成能存储的程序文件。不方便的,应编写成能存储的程序文件。(2)M文件的程序工作方式文件的程序工作方式 较多的命令较多的命令 重复输入重复输入 将要输入的所有指令按顺序放到一个将要输入的所有指令按顺序放到一个扩扩展名为展名为“.m”的文本文件的文本文件中,每次运行时中,每次运行时只只要输入要输入M文件的文件名即可文件的文件名即可。这种工作模式。这种工作模式称为称为M文件的程序工作方式。文件的程序工作方式。5.1 M文件简介文件
3、简介 用用MATLAB语言编写的程序,称为语言编写的程序,称为M文件文件。5.1.1 M文件的建立与编辑文件的建立与编辑 M文件是一个文本文件,它可以用任何编辑程文件是一个文本文件,它可以用任何编辑程序来建立和编辑,而一般常用且最为方便的是序来建立和编辑,而一般常用且最为方便的是使用使用MATLAB提供的文本编辑器提供的文本编辑器。1、建立新的、建立新的M文件文件 启动启动MATLAB文本编辑器有文本编辑器有3种方法:种方法:方法一:方法一:菜单操作菜单操作 File New M-file MATLAB Editor窗口窗口 输入输入M文件的内容并存盘。文件的内容并存盘。方法二:命令操作方法二
4、:命令操作 在在MATLAB命令窗口输入命令命令窗口输入命令edit,启动,启动MATLAB文本编辑器后,输入文本编辑器后,输入M文件的内容并存盘。文件的内容并存盘。方法三:命令按钮操作方法三:命令按钮操作 单击单击MATLAB主窗口工具栏上的主窗口工具栏上的New M-File命令命令按钮按钮 ,启动,启动MATLAB文本编辑器后,输入文本编辑器后,输入M文文件的内容并存盘。件的内容并存盘。注意:注意:M文件的存放位置默认情况下是文件的存放位置默认情况下是 MATLAB安装目录下的安装目录下的work子目录。子目录。2、编辑已有的、编辑已有的M文件文件方法一:方法一:菜单操作菜单操作 Fil
5、e Open Open对话框对话框 M文件文件方法二:方法二:命令操作命令操作 在在MATLAB命令窗口输入命令:命令窗口输入命令:edit 文件名文件名方法三:方法三:命令按钮操作命令按钮操作工具栏工具栏Open File 选择所需打开的选择所需打开的M文件。文件。MATLAB提供了两种源程序文件格式:提供了两种源程序文件格式:脚脚本文件本文件和和函数文件函数文件,这两种文件的扩展名均为,这两种文件的扩展名均为“.m”。M脚本(脚本(Scripts)文件(命令行文件):没有)文件(命令行文件):没有输入参数,也不返回输出参数;输入参数,也不返回输出参数;M函数(函数(Functions)文件
6、:可以输入参数,也)文件:可以输入参数,也可返回输出参数。可返回输出参数。5.1.2 M脚本文件和脚本文件和M函数文件函数文件一、一、M脚本文件(命令行文件)脚本文件(命令行文件)本质:是一串指令的集合,与在命令窗本质:是一串指令的集合,与在命令窗口逐行执行文件中的所有指令,其结果是一口逐行执行文件中的所有指令,其结果是一样的。样的。将需要运行的命令编辑到一个命令文件将需要运行的命令编辑到一个命令文件中,然后在中,然后在MATLAB命令窗口直接输入该命命令窗口直接输入该命令文件的名字(执行方法)令文件的名字(执行方法),就会顺序执行,就会顺序执行命令文件中的命令,该文件称为命令文件中的命令,该
7、文件称为脚本文件脚本文件。(1)脚本文件中的命令格式和前后顺序,与)脚本文件中的命令格式和前后顺序,与在命令窗口中输入的指令无区别;在命令窗口中输入的指令无区别;(2)与在命令窗口中直接运行命令一样,脚)与在命令窗口中直接运行命令一样,脚本文件产生的变量都驻留在本文件产生的变量都驻留在MATLAB的的workspace中,可以方便查看变量;脚本文件中,可以方便查看变量;脚本文件可以直接访问可以直接访问workspace中的所有数据;中的所有数据;(3)文件的文件名要避免与)文件的文件名要避免与MATLAB内内置函数与工具箱中的函数重名,并要放在搜置函数与工具箱中的函数重名,并要放在搜索路径内。
8、索路径内。例例1:建立一个脚本文件,将变量:建立一个脚本文件,将变量a、b的值互换。的值互换。解:建立解:建立try1.m文件文件a=1:9;b=11 12 13;14 15 16;17 18 19;c=a;a=b;b=c;ab指令窗口执行该程序指令窗口执行该程序 try1a=11 12 13 14 15 16 17 18 19b=1 2 3 4 5 6 7 8 9二、二、M函数文件函数文件 函数文件函数文件(Function file)是另一种形式的是另一种形式的M文件,文件,每每一个函数文件都定义一个函数一个函数文件都定义一个函数。1.脚本文件和函数文件的区别:脚本文件和函数文件的区别:(
9、1)M脚本文件不需要输入任何参数,也不返回任何脚本文件不需要输入任何参数,也不返回任何参数,主要是为了解决在命令窗口中反复输入命令的繁参数,主要是为了解决在命令窗口中反复输入命令的繁琐操作;琐操作;M函数文件通常包含输入参数,也可以返回输函数文件通常包含输入参数,也可以返回输出参数,主要解决参数传递和函数调用的问题。出参数,主要解决参数传递和函数调用的问题。(2)脚本文件对)脚本文件对workspace中的变量进行操作;函数文中的变量进行操作;函数文件的变量为局域变量,只有其输出的变量保存在件的变量为局域变量,只有其输出的变量保存在workspace中。中。2.函数文件格式函数文件格式 fun
10、ction 输出形参表输出形参表=函数名(输入形参表)函数名(输入形参表)函数帮助信息行函数帮助信息行 函数体函数体是函数的功能实现部分是函数的功能实现部分 特定规则:特定规则:m函数文件第一行必须以单词函数文件第一行必须以单词function作为引导词;作为引导词;函数信息行:给出函数的帮助信息,帮助信息要函数信息行:给出函数的帮助信息,帮助信息要从从%开头,并放在一行的开头,在指令窗口中用开头,并放在一行的开头,在指令窗口中用help+文文件名可查询到;件名可查询到;函数名的命名规则与变量名相同;函数名的命名规则与变量名相同;m函数文件的函数文件的文文件名件名建议直接用建议直接用函数名函数
11、名.m,也可以与函数名不同,但,也可以与函数名不同,但是是调用时使用文件名调用时使用文件名;当函数的输出形参多于当函数的输出形参多于1个时,应用个时,应用方括号,参数之方括号,参数之间用逗号隔开:间用逗号隔开:function a,b=mfile(x,y);当函数无输出参;当函数无输出参数时,输出参数项应为空,或者用空的中括号表示:数时,输出参数项应为空,或者用空的中括号表示:function mfile(x,y)或者或者function =mfile(x,y);函数执行后,函数执行后,只保留最后的返回结果只保留最后的返回结果,不保留任何中间,不保留任何中间过程。程序中的变量均为过程。程序中的
12、变量均为局部变量局部变量,不保存在工作空间中,不保存在工作空间中,其变量只在函数运行期间有效,随函数调用的结束而从工其变量只在函数运行期间有效,随函数调用的结束而从工作空间消除。作空间消除。【例】编写函数文件求小于任意自然数n的Fibonacci数列各项。function f=ffib(n)%用于求Fibonacci数列的函数文件%f=ffib(n)%1999年9月30日编 f=1,1;i=1;while f(i)+f(i+1)f2c(100)c=37.7778 【例11】利用函数的递归调用,求n!。function f=factor(n)if n=1 y=2*x.2+1 elseif(x-1
13、)y=0 else y=-x.3 end2321 10 11 1xxyxxx 例例4:计算函数:计算函数y=绘出函数绘出函数 的图像。的图像。x=-3:0.1:3;if x=1 y=2*x.2+1;plot(x,y)elseif-1x trangrade(97)ans=A trangrade(67)ans=D trangrade(55)ans=E【例6】根据变量 num 的值来决定显示的内容。num=input(请输入一个数);switch num case-1 disp(I am a teacher.);case 0 disp(I am a student.);case 1 disp(You
14、 are a teacher.);otherwise disp(You are a student.);end三程序设计(一)选择结构5.2.2 循环结构循环结构1.while循环循环 while循环以不定的次数重复执行一组语句。循环以不定的次数重复执行一组语句。语法为:语法为:while 逻辑表达式逻辑表达式 循环体语句循环体语句 end while语句执行过程,只要表达式里面的所有元素为语句执行过程,只要表达式里面的所有元素为真,就执行真,就执行while和和end之间的语句,否则就结束循环。之间的语句,否则就结束循环。在设计在设计while循环时,循环时,应在循环体内有修改应在循环体内有
15、修改“逻辑表逻辑表达式达式”的部分,的部分,确保执行了一定次数后可以退出循环。确保执行了一定次数后可以退出循环。例例8:用:用while循环求循环求1100间整数的和间整数的和 sum=0;i=1;while i=100 sum=sum+i;i=i+1;end sum sum=5050例例9:编写函数文件求小于自然数:编写函数文件求小于自然数n的婓波纳契数列各的婓波纳契数列各项。该数列是一整数数列,其中每个数等于前面两数项。该数列是一整数数列,其中每个数等于前面两数之和。已知前两项为之和。已知前两项为1 1。function f=fbnq(n)%计算婓波纳契数列各项计算婓波纳契数列各项f=1
16、1;i=1;while f(i)+f(i+1)fbnq(30)ans=1 1 2 3 5 8 13 21例例10:按照下面的表达式计算,直至:按照下面的表达式计算,直至1/n!小于小于0.001。111111!2!3!en 建立脚本文件建立脚本文件ex10.merror=0.001;x=1;y=0;n=1;while xerror y=y+x;x=x/n;n=n+1;endy运行结果:运行结果:ex10y=2.71812.for循环循环 for循环允许一条或者一组语句被重复执行预先指循环允许一条或者一组语句被重复执行预先指定的次数。定的次数。for循环的语法为:循环的语法为:for 循环变量循
17、环变量=表达式表达式1:表达式:表达式2:表达式:表达式3 循环体循环体 end循环次数循环次数:)(步长步长初值初值终值终值 fix说明:说明:表达式表达式1的值为循环变量的初值,表达式的值为循环变量的初值,表达式2的值为的值为步长,表达式步长,表达式3的值为循环终值,当步长为的值为循环终值,当步长为1时,可以省时,可以省略。表达式的值可以是正整数、负整数或者小数。略。表达式的值可以是正整数、负整数或者小数。循环次数如何计算?循环次数如何计算?例例11:用:用for循环求循环求1100间整数的和间整数的和sum=0;for i=1:100 sum=sum+i;endsum例例12:使用:使用
18、for循环计算循环计算 以及以及i!(i=1:10)的值。)的值。101!ii解:编写脚本文件解:编写脚本文件forsum.msum=0;part=1;for i=1:10 part=part*i;fprintf(part(%d)=%dn,i,part)sum=sum+part;endfprintf(sum=%dn,sum)运行结果:运行结果:forsumpart(1)=1part(2)=2part(3)=6part(4)=24part(5)=120part(6)=720part(7)=5040part(8)=40320part(9)=362880part(10)=3628800sum=403
19、79132.主函数和子函数主函数和子函数主函数和子函数的区别:主函数和子函数的区别:(1)MATLAB允许一个允许一个M函数文件包含多个函数的代函数文件包含多个函数的代码,其中第一个出现的函数称为主函数,其余的函数码,其中第一个出现的函数称为主函数,其余的函数为子函数。为子函数。(2)保存时所用的函数名称与主函数定义名相同。)保存时所用的函数名称与主函数定义名相同。(3)主函数可以在)主函数可以在M文件外部调用,而子函数不行。文件外部调用,而子函数不行。(4)同一文件的主函数和子函数的工作空间是相互独)同一文件的主函数和子函数的工作空间是相互独立的。立的。例例18:编写一函数,要求输入任意两个
20、数后,求出这:编写一函数,要求输入任意两个数后,求出这两数之和与绝对值之和的积。两数之和与绝对值之和的积。function ch=sub(x,y)%主函数主函数ch=sub1(x,y)*sub2(x,y);function ch=sub1(x,y)%子函数子函数1ch=x+y;function ch=sub2(x,y)%子函数子函数2ch=abs(x)+abs(y);运行结果:运行结果:sub(4,3)ans=49 sub(4,-3)ans=75.3.2 局部变量和全局变量局部变量和全局变量1.局部变量(局部变量(Local Variables)局部变量是在函数体内部的变量,其影响范围是本局部
21、变量是在函数体内部的变量,其影响范围是本函数内部,而且不加载到函数内部,而且不加载到MATLAB的工作空间。局部的工作空间。局部变量只在函数执行期间存在,当函数执行完变量就消失。变量只在函数执行期间存在,当函数执行完变量就消失。2.全局变量(全局变量(Global Variables)全局变量是可以在不同的函数工作空间和全局变量是可以在不同的函数工作空间和MATLAB工作空间中共享使用的变量。在使用前必须工作空间中共享使用的变量。在使用前必须用用global定义,而且在任何使用该变量的函数中都要加定义,而且在任何使用该变量的函数中都要加以定义,即使在命令窗口中也不加以例外。以定义,即使在命令窗
22、口中也不加以例外。function f=global_exam(x,y)%define 2 global variablesglobal A Bf=A*x+B*y;在命令窗口中输入在命令窗口中输入 global A B A=1;B=2;f=global_exam(2,3)f=85.3.3 函数的参数函数的参数1.函数的调用函数的调用函数的调用方式:函数的调用方式:输出实参表输出实参表=函数名(输入实参表)函数名(输入实参表)2.函数参数的个数函数参数的个数nargin:该函数输入实参的个数:该函数输入实参的个数nargout:该函数输出实参的个数:该函数输出实参的个数nargin在函数体内获得
23、实际输入变量个数在函数体内获得实际输入变量个数nargout在函数体内获得实际输出变量个数在函数体内获得实际输出变量个数nargin(fun)在函数体外获取定义的输入参数个数在函数体外获取定义的输入参数个数nargout(fun)在函数体外获取定义的输出参数个数在函数体外获取定义的输出参数个数例例19:编程实现,若只输入一个变量,系统提示输入错误,编程实现,若只输入一个变量,系统提示输入错误,若输入两个、三个变量,则将各变量相加,将和输出。若输入两个、三个变量,则将各变量相加,将和输出。nargintest(1,2,3)ans=6 nargintest(1,2,3,4)?Error using=nargintestToo many input arguments.nargintest(1)?Error using=nargintestNot enough input arguments nargintest(1,2)ans=3 function f=nargintest(a,b,c)if nargin=1 error(Not enough input arguments);elseif nargin=2 f=a+b;elseif nargin=3 f=a+b+c;end