MAT程序基础设计应用 7_第1页
MAT程序基础设计应用 7_第2页
MAT程序基础设计应用 7_第3页
MAT程序基础设计应用 7_第4页
MAT程序基础设计应用 7_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MATLABProgrammingandEngineeringApplicationMATLAB程序设计与工程应用本书知识结构第4章函数4.1函数的基本概念了解函数和函数文件的概念,函数文件的特点及其与脚本文件的区别。熟悉函数的基本结构,掌握函数声明语句的基本格式。4.2函数的创建与调用掌握创建函数的基本方法,了解函数调用的概念,掌握MALTAB中函数调用的基本方法和常用格式。4.3局部函数、嵌套函数和匿名函数了解局部函数、嵌套函数和匿名函数的概念,各种函数的创建和使用方法。4.4函数之间的数据共享掌握函数之间数据共享的基本方法及其应用,熟悉局部变量、永久变量、全局变量的概念及用法上的区别。4.5函数的参数验证了解函数参数验证的概念,了解位置参数、可选位置参数、重复参数、名值对参数等概念,掌握各种参数的声明及使用方法。在结构化程序中,函数又称为子程序(Subroutine),是功能相对独立、需要重复使用(调用)的一段程序代码。与数学中函数的概念类似,程序中的函数一般有专门的函数名和若干个输入输出变量。4.1函数的基本概念4.1.1函数文件在MATLAB中,如果M文件中第一条可执行语句(除程序注释以外的语句)以关键字function开始,该文件就成为函数文件(Functionfile)。函数文件具有如下特点:(1)一般情况下,每个函数文件中定义一个函数。这种情况下,文件名必须与函数名完全相同。与普通的脚本程序文件一样,函数文件名的后缀仍然为.m。4.1函数的基本概念(2)在一个M文件中也可以同时定义多个函数,此时第一个函数是主函数,文件名必须是该主函数的函数名。在主函数或脚本代码后面的函数称为局部函数,只能在同一个文件内调用。有关局部函数的概念和用法将在后面介绍。(3)从R2016a版本开始,MATLAB也允许像其他高级语言程序一样,将一个函数与调用函数的程序一起放在同一个文件中,此时函数必须放在调用该函数的程序后面。(4)与脚本程序不同的是,由于函数一般带有入口参数,所以函数不能独立运行,但可以在其他函数或者脚本程序中调用,也可以在命令行窗口通过给定入口参数进行调用。4.1函数的基本概念4.1.2函数文件的基本结构最基本的函数主要包括3部分,即函数声明、函数体和end语句,此外还可以用程序注释的形式(每行以“%”开头)为函数添加必要的说明和帮助信息等。例如,下面的代码定义了一个完整的函数:functionf=fact(n)%函数声明,函数名,输入输出变量列表 %求n的阶乘 %n必须为正整数 f=prod(1:n);%函数体end4.1函数的基本概念其中函数名为fact,该函数有一个入口参数n,函数将1~n的连乘结果保存到出口参数f中。(1)函数声明:位于函数文件的首行。(2)函数体:实现该函数功能的MATLAB命令、接收输入参数、实现程序流程控制等。(3)函数结束语句:在函数体的最后,利用end语句表示函数体的结束。(4)函数的帮助信息:在函数声明行之后,函数体之前,可以利用注释对该函数功能、输入和输出参数进行一些必要的简单说明,如上述代码中的第2和第3行。4.1函数的基本概念函数的声明函数声明的作用是定义函数名、函数的入口参数(输入参数)和出口参数(输出参数)。在MATLAB中,函数声明语句以关键字function开头,后面紧跟着的是函数的返回值列表(出口参数)和一个“=”符号。语句右侧首先是函数的名称,之后在小括号中列出函数的入口参数。函数声明语句的基本格式如下:function[y1,...,yN]=myfun(x1,...,xM)其中,myfun为函数名,一般取有意义的英文单词,必须以字母开头,可以包含字母、数字或下划线;x1,…,xM为输入参数;y1,…,yN为输出参数。4.1函数的基本概念几点说明:(1)在函数文件中,函数声明语句必须是函数文件中的第一条可执行语句,只可以在前面添加注释语句等。保存文件时,函数文件名必须是函数名,并且以.m为后缀。(2)如果函数是定义在脚本文件的末尾,将与所在的脚本文件一起保存。此时,脚本文件名不能与文件中的函数具有相同的名称。(3)函数可以没有输入参数,也可以有一个或多个输入参数。所有的输入参数必须放在一对小括号中,并用逗号隔开。如果没有输入参数,可以忽略函数名后的小括号。4.1函数的基本概念(4)函数的出口参数可以没有,也可以有一个或者多个。如果没有输出参数,在函数声明语句中可以将其忽略不写,后面的“=”也不能写。例如:functionmyFun(x)如果函数只有一个输出参数,则在function关键字后面直接指定输出参数的名称。例如,如下函数只有一个输出参数myOutput:functionmyOutput=myFun(x)如果函数有多个输出参数,必须将所有的输出参数写在方括号中。例如,如下函数有3个输出参数one、two和three:function[one,two,three]=myFun(x)4.1函数的基本概念函数体函数体是实现函数具体功能的语句块,其中可以包括任何有效的MATLAB表达式、分支和循环结构程序段、注释、空白行和嵌套函数。在函数体内可以根据需要创建新的变量,所有在函数体内创建的变量都存储在该函数的工作区内,该工作区独立于MATLAB的基础工作区,称为函数工作区。函数返回到调用该函数的主程序时,函数工作区自动关闭,其中的变量也不能再被访问。此外,与普通的脚本程序一样,函数体内的语句末尾如果有分号,则该语句的运算结果不会在命令行窗口显示,该语句中创建的变量也不显示在工作区。如果函数体内的某条语句没有分号结尾,则语句执行的结果将显示在命令行窗口,但所创建的变量仍然为局部变量,不会显示在MATLAB的基础工作区。4.1函数的基本概念

end语句函数体以end语句结束,也可以是遇到文件的末尾或者一个新的function声明语句结束。只有当一个函数中有嵌套函数时,才需要在嵌套函数的最后使用end语句。但是为了增强程序的可读性,最好还是将每个函数以end语句结束,并且与函数文件第一行的function关键字左对齐,函数体中的语句都缩进适当距离。4.2函数的创建与调用为创建一个新的函数,可以单击MATLAB主页选项卡中新建按钮下的箭头,在下拉菜单中选中函数菜单命令,即可打开MATLAB编辑器子窗口,在其中即可像普通的脚本文件一样创建函数文件,如图4-1所示。图4-1MATLAB创建的函数文件4.2函数的创建与调用利用上述方法创建的函数文件,在形式上与普通的脚本文件主要有如下两点区别:(1)新建的函数文件不是一个空白文件,其中已经自动添加了一些语句和代码。第一条是函数声明语句,其中定义了函数名untitled、函数的输入参数inputArg1和inputArg2、输出参数outputArg1、outputArg2等。(2)新建的函数文件自动命名为Untitled*.m。在定义了函数并保存文件时,自动以定义的函数名作为文件名。4.2函数的创建与调用定义函数文件并保存后,即可在命令行或者其他脚本命令、程序和函数文件中调用(Call)。调用时,将入口参数按照顺序列在函数名后的小括号中,并根据需要将返回值赋给指定的变量。在函数定义中给定的输入输出参数称为形式参数(简称形参,FormalParameter)。在调用时,必须根据形参的要求,将正确的参数值作为实在参数(简称实参,ActualParameter)传递给函数。函数体接收到这些实参值后,执行相应的功能和操作,并将运算结果通过输出参数返回。4.2函数的创建与调用--------------------------------------------------------------------------------------------------------实例4-1函数的创建与调用创建MATLAB函数实现排列问题的求解。已知排列数的计算公式为--------------------------------------------------------------------------------------------------------首先在MATLAB中新建脚本,并在打开的编辑器子窗口中定义如下函数:%文件名:pnr.mfunctionp=pnr(n,r)

p1=1;p2=1

fori=1:n%求n!

p1=p1*i;

end

fori=1:n-r%求(n-r)!

p2=p2*i;

end

p=p1/p2;%求排列数end该函数名为pnr,因此保存文件时,文件将自动命名为pnr.m。上述函数文件保存后,在命令行窗口输入如下命令即可调用执行:>>pnr(5,2)ans=

204.2函数的创建与调用出口参数的写法有如下三种情况:(1)只有一个出口参数的情况例如,如下语句定义了一个函数average:

functiony=average(x)

y=sum(x)/length(x);

end在命令行或者其他文件中,可以用如下脚本命令调用上述函数:

>>z=1:99;

%创建一个行向量z

>>average(z)

%将z作为输入参数,调用上述函数求其中所有元素的平均值

ans=

504.2函数的创建与调用出口参数的写法有如下三种情况:(2)有多个出口参数的情况例如,如下语句定义了一个函数stat:function[m,s]=stat(x)n=length(x);m=sum(x)/n;s=sqrt(sum((x-m).^2/n));end该函数实现的功能是求输入向量x中所有元素的平均值和方差,并分别保存在出口参数m和s中返回。调用时,返回变量也必须用中括号括起来。例如,>>values=[12.7,45.4,98.9,26.6,53.1];>>[ave,stdev]=stat(values)ave=47.3400stdev=29.41244.2函数的创建与调用---------------------------------------------------------实例4-2函数中的数组参数创建函数实现如下功能:(1)统计一个向量中正数的个数;(2)求该向量中所有正数的算术平方根。---------------------------------------------------------本例定义的函数如下:%文件名:sqrArr.mfunction[num,sA]=sqrArr(A)%出口参数num:正数的个数;%sA:结果向量;%入口参数A:向量,各元素可能是0、正数或负数。

num=0;

%正数个数初始化为0

sA=A;

%结果向量初始化为等于原向量

fori=1:length(A)

ifA(i)>0

%判断是否为正数,若是

num=num+1;

%则将个数加1

sA(i)=sqrt(A(i));

%调用内置函数sqrt()求平方根

end

endend在函数体中,依次取出向量A中的各元素,判断其是否为正数。如果为正数,则将num变量的值加1,同时调用MATLAB中的内置函数sqrt()求该元素的平方根。调用该函数的命令及其执行结果如下:>>[n,sA]=sqrArr([1,-2,100,-50,64])n=

3sA=

1-210-5084.3局部函数、嵌套函数和匿名函数4.3.1局部函数在同一个MATLAB程序文件中,可以包含多个函数。在函数文件中,第一个函数称为主函数。该函数对其他文件是可见的,也可以从命令行直接进行调用。文件中的其他函数称为局部函数,可以任意顺序出现在主函数后面。局部函数仅对同一文件中的其他函数可见,等效于其他编程语言的子例程,有时又称为子函数。在只有主函数和局部函数的文件中,局部函数可以按照任意顺序出现在文件中主函数的后面。保存时,文件名必须是主函数名。自R2016b版本开始,也可以在脚本文件中创建局部函数,这些函数都必须放在脚本代码最后一行的后面。如果一个M文件中同时有脚本命令和局部函数,文件名不能与局部函数名相同。与普通的函数一样,局部函数创建的变量保存在自己的工作区中,局部函数不能访问其他函数中的变量,除非将这些变量作为参数传递。4.3局部函数、嵌套函数和匿名函数------------------------------------------实例4-3局部函数的使用%文件名:localfun.mfunctionb=localfun(a) %主函数b=fun1(a)+fun2(a);endfunctiony=fun1(x) %局部函数1y=x^2;endfunctiony=fun2(x) %局部函数2y=x*2;end------------------------------------------可以从命令行或另一程序文件中调用主函数localfun,但局部函数fun1和fun2只能被主函数调用。例如,如下命令:>>localfun(2.5)以2.5作为入口参数调用主函数localfun。执行localfun函数时,又进一步调用局部函数fun1和fun2,并将调用主函数时的入口参数2.5传递给两个局部函数,最后得到如下结果:ans=11.25004.3局部函数、嵌套函数和匿名函数4.3.2嵌套函数嵌套函数是完全包含在一个函数内的函数。与局部函数一样,含有嵌套函数的文件,其文件名也必须与外层的主函数名相同。嵌套函数与局部函数的主要区别在于:嵌套函数可以使用在其外层函数中定义的变量,外层函数在调用嵌套函数时,不需要将这些变量作为参数传递给内层的嵌套函数。4.3局部函数、嵌套函数和匿名函数4.3.2嵌套函数实例4-4嵌套函数的使用%文件名:nestfun.mfunctiony=nestfun(a,b)

%外层函数(主函数)m=2;n=5;y=fun1(a)+fun2(b);functiony1=fun1(a)

%嵌套函数1y1=a*mendfunctiony2=fun2(b) %嵌套函数2y2=b*nendend之后,在命令行窗口输入如下命令:>>nestfun(-1,-2)按回车键后将立即显示如下执行结果:y1=-2y2=-10ans=-124.3局部函数、嵌套函数和匿名函数4.3.3匿名函数匿名函数是一个不用程序文件保存,但与一个称为函数句柄(function_handle)的变量相关联的函数。匿名函数可以接收多个输入并返回一个输出,但只能包含一个可执行语句。例如,如下语句sqr=@(x)x.^2;创建了一个匿名函数,其中sqr是一个函数句柄,用于代表该匿名函数,相当于函数的名字;运算符@用于创建该函数句柄,后面小括号中给出该匿名函数的自变量(输入参数)。右侧空格后是函数体,只能是一个表达式。4.3局部函数、嵌套函数和匿名函数定义了匿名函数后,程序中即可通过函数句柄调用。例如:a=sqr(5)

的执行结果为

a=25。使用匿名函数的好处在于,不必编辑和维护函数文件,特别是对于只需要一个简短定义的函数。例如,如下命令>>q=integral(@(x)x.^2.*exp(-2*x),-1,1)实现的是如下数学积分运算在上述命令中,将积分函数x2定义了一个匿名函数,作为MATLAB内置积分函数integral()的第一个参数,后面两个参数-1和1分别为积分的下限和上限。命令的执行结果为

q=1.6781。4.4函数之间的数据共享4.4.1函数的工作区与局部变量MATLAB中定义的函数不占用基础工作区,每个函数都有自己的工作区,称为函数工作区。每个局部函数、嵌套函数都有其自己的工作区,并与基础工作区和其他函数的工作区是独立的,调用执行该函数的过程中,才能访问其工作区中的变量。这样能够保证数据的相互独立性和完整性,避免数据冲突等。位于一个函数工作区内,不能被其他函数访问的变量称为局部变量(LocalVariable)。这些局部变量在函数之间相互调用时不会保存在计算机的内存中,因此不能被其他函数访问。4.4函数之间的数据共享例如,分别定义如下两个函数:functionmyFun1()%函数myFun1() n=0; n=n+1endfunctionmyFun2()

%函数myFun1() n=0; n=n-1end上述两个函数分别都一个变量n。尽管这两个变量同名,但分别存放于两个函数的工作区,因此分别都是局部变量,变量的值互不影响。将这两个函数分别保存为文件后,在命令行窗口直接调用,得到如下结果:>>myFun1()n=1>>myFun2()n=-14.4函数之间的数据共享4.4.2工作区之间的数据共享通过参数传递实现数据共享例如,创建如下两个函数functiony1=update1(x1)y1=1+update2(x1);endfunctiony2=update2(x2)y2=2*x2;end利用下面的语句调用函数update1:X=[1,2,3];Y=update1(X)在以数组X为输入参数调用update1时,update1函数内又将该参数x1作为入口参数x2,进一步调用函数update2,从而实现将基础工作区的数组X传递给update2函数,作为其输入参数x2。执行结果为:Y=3574.4函数之间的数据共享利用嵌套函数实现数据共享例如,在下面的函数定义中:functionfun1 %定义上层函数x=1;fun2 %调用嵌套函数functionfun2 %定义嵌套函数x=x+1;endend对其中定义的两个函数,fun1是上层函数,fun2为嵌套函数,因此在fun2中,可以访问fun1中定义的变量x,也就是说,两个函数都能共享变量x。4.4函数之间的数据共享利用永久变量实现数据共享在一个函数内将某个变量声明为永久变量(PersistentVariable),该变量的值将在函数之间相互调用时一直保存而不会丢失,这样的变量又称为静态变量(StaticVariable)。在MATLAB中,使某个变量成为永久变量的方法是在函数体中使用该变量之前,利用persistent

关键字对该变量进行声明。声明后的永久变量将被初始化为空矩阵。每次调用永久变量所在的函数,该变量的值都将是上次调用执行该函数后得到的结果。4.4函数之间的数据共享例如,定义如下函数:functionmyFun() persistentn ifisempty(n) n=0; end n=n+1end上述函数没有输入和输出参数,只声明了函数名为myFun。在函数体中,利用persistent

关键字将变量n声明为永久变量。之后,调用MATLAB的内置函数isempty判断变量n是否为空,也就是当前调用执行函数myFun时,变量n是否已经被赋值。如果没有被赋值,说明这是第一次调用该函数,则将n赋值为0。然后将变量的值加1得到1,该变量值将一直保存在内存中,直到后续再次调用该函数。4.4函数之间的数据共享当后续再次调用函数MyFun时,由于前面已经调用过一次该函数,变量n不再为空矩阵,则不将n重新赋值为0,而是继续执行后面的语句,将其中加1。由于是永久变量,加1之前的值为前一次调用该函数执行后的结果,因此第二次调用时,将其值递增变为2。如此重复。将上述函数保存为文件myFun.m,在命令行窗口重复调用该函数,将得到如下结果:>>myFunn=1>>myFunn=2>>myFunn=3>>myFunn=4……4.4函数之间的数据共享利用全局变量实现数据共享全局变量(GlobalVariable)是能够在多个函数中访问,也能够通过命令行访问的变量。每个全局变量有其自己的工作区,并与MATLAB的基础工作区和函数工作区相互独立,互不影响。将一个变量定义为全局变量的方法是在使用该变量前,用global关键字对其进行声明。例如,创建如下函数:functionh=myFun(t)globaln %在函数体中声明后面要用到的n为全局变量h=1/2*n*t.^2;end4.4函数之间的数据共享之后,在命令行窗口输入如下命令:>>globaln >>n=10; >>y=myFun((0::5));上述第一条命令将变量n声明为全局变量,再利用第二条命令在MATLAB基础工作区创建该变量,并为其赋值。第三条命令调用函数myFun。在myFun函数体中,同样用global关键字将n声明为全局变量,执行后在基础工作区得到如下结果:y=052045801254.5函数的参数验证与其他高级语言相比,在MATLAB程序中定义函数时,不需要对输入和输出参数的数据类型等进行声明。此外,在程序中不同地方调用同一个函数时,还可以根据需要为函数传递不同个数的入口和出口参数。函数的参数验证(ArgumentValidation)是对函数输入输出参数进行特定限制的一种方法。使用参数验证,可以约束参数的数据类型、数组参数的大小以及参数的其他属性,而无需在函数主体中编写代码来执行这些测试。通过函数的参数验证,MATLAB能够对特定代码块进行检查,以便提取有关函数的信息。利用参数验证可以消除繁琐的参数检查代码,提高代码的可读性,便于程序的维护。同时,利用参数验证语法还可以实现特殊参数(可选参数、重复参数和名值对参数)的定义,实现很多特殊功能。4.5函数的参数验证函数参数的有效性声明是MATLAB实现参数验证的一种方法,其作用是对函数参数进行适当限制,并通过参数验证检查返回特定错误消息。当在其他程序中调用该函数时,可以在执行函数的具体功能代码之前确保传递的参数是有效的。函数参数的有效性声明利用arguments和end关键字包围的参数声明模块实现,基本语法格式如下:arguments inarg1(dim)dataType{validators}=defaultValue ... inargN...

end4.5.1参数的有效性声明4.5函数的参数验证上述参数声明模块必须位于函数体中所有可执行的功能代码之前,每一行对函数中的一个入口参数(例如其中的inarg1、…、inargN)进行声明。(1)dim:声明入口参数的维数,指定为用逗号分隔的两个或多个数字。(2)dataType:声明入口参数的数据类型,例如double,integer,char,string等。(3)validators:用逗号分隔的验证函数列表。(4)defaultValue:声明参数的默认值。默认值可以是常量或者表达式,其中表达式可以引用在同一个参数声明模块中之前声明的参数,但不能引用在该表达式后面声明的参数。4.5函数的参数验证函数输出参数的有效性声明:arguments(Output)outarg1(dim)class{validators}...outargN...end输出参数的有效性声明模块必须位于所有输入参数声明模块之后,并且必须在函数体中所有可执行的代码之前。此外,不能为输出参数(outarg1、…、outargN)定义默认值。4.5函数的参数验证在arguments/end语句块中,可以为每个输入或输出参数指定验证函数。验证函数用于指定和验证参数的有效性,一般是对输入或输出的数据类型、取值范围等进行限定。在MATLAB中,提供了很多内置函数可以用作验证函数,常用的验证函数如表4-1所示。4.5.2验证函数4.5函数的参数验证实例4-5函数参数的有效性声明%文件名:ex4_5.mclear %主程序clcA="12";B=[234];C=myFunction(A,B) %函数调用4.5函数的参数验证%===========================================functionout=myFunction(A,B) %函数定义 arguments %参数有效性声明 A(1,1){mustBeText} B(1,:){mustBeReal} end out=A+length(B); %函数的可执行功能代码end验证正确(合法调用)

在主程序中,参数A赋值为一个字符串。参数B赋值为长度为3的行向量,3个元素都为实数,因此两个参数是合法有效的。程序执行后得到如下结果:C="123"4.5函数的参数验证验证错误(非法调用)

如果在主程序中将变量A用如下语句A=12;

重新赋值为一个默认的double型数据,则执行后将在命令行窗口显示如下提示信息:4.5函数的参数验证位置参数位置参数(PositionalArgument)是在调用时必须以特定顺序传递给函数的参数,参数列表中各形参的位置必须与参数声明模块中声明的顺序相对应,并且所有参数名称必须唯一。如果在参数声明模块中设置了参数的默认值,则该位置参数就成为可选位置参数(OptionalPositionalArgument)。在调用时,如果没有给定与这些可选位置参数对应的实参,则执行函数代码时使用默认值。4.5.4参数的种类4.5函数的参数验证在参数有效性声明语句中,可选位置参数必须位于所有必需位置参数之后。例如,在下面的函数定义中:functionmyFun(x,y,maxval,minval)arguments %参数代码块x(1,:)doubley(1,:)doublemaxval(1,1)double=max(max(x),max(y))minval(1,1)double=min(min(x),min(y))end… %函数功能代码块end4.5函数的参数验证参数maxval

minval的

默认值分别为参数x和y中的最大值和最小值,因此是可选位置参数。调用时,可以使用下面的命令:>>myFun(x,y,maxval,minval)>>myFun(x,y,maxval)>>myFun(x,y)其中,第一条命令给定了所有4个参数。在第二条命令中,没有给定可选位置参数minval。在第三条命令中,两个可选位置参数maxval和minval都没有给定。4.5函数的参数验证

重复参数在参数声明模块中包含Repeating属性,即可将相应的参数设置为重复参数(Repeatin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论