M文件有两种形式:脚本文件和函数文件。脚本文件通常用于执行一系列简单的MATLAB命令,运行时只需输入文件名字,MATLAB就会自动按顺序执行文件中的命令.
函数文件和脚本文件不同,它可以接受参数,也可以返回参数,在一般情况下,用户不能靠单独输入其文件名来运行函数文件,而必须由其他语句来调用,MATLAB的大多数应用程序都以函数文件的形式给出。
MATLAB提供了极其丰富的内部函数,使得用户可以通过命令行调用就可以完成很多工作,但是想要更加高效的利用MATLAB,离不开MATLAB编程。
用户可以通过组织一个MATLAB命令序列完成一个独立的功能,这就是脚本M文件编程;而把M文件抽象封装,形成可以重复利用的功能块,这就是函数M文件编程。
M文件是包含MATLAB代码的文件。M文件按其内容和功能可以氛分为脚本M文件和函数M文件。
(1)脚本M文件
它是许多MATLAB代码按照顺序组成的命令序列集合,不接受参数的输入和输出,与MATLAB工作区共享变量空间。通常用来实现一个相对独立的功能,比如对某个数据进行分析和绘图等。用户可以在命令窗口输入文件名来运行脚本文件中的所有代码。
(2)函数M文件
它是为了实现一个单独功能的代码块,但与脚本文件的不同之处在于需要接收参数的输入和输出,函数M文件中的代码一般只处理输入参数传递的数据,并把结果返回到指定的地方。因此,函数M文件具有独立的内部变量空间。MATLAB提供的许多函数就是用函数M文件编写的。
在复杂的程序结构中,变量是各种程序结构的基础。
MATLAB中变量的命令规则包括以下内容:
(1)必须以字母开头,之后可以是任意字母、数字或者下划线;
(2)变量命名不能有空格,变量名称区分大小写;
(3)变量名称不能超过63个字符,第63个字符之后的部分都将被忽略。
脚本文件是M文件中最简单的一种,不需要输入顿号输出参数,用命令语句可以控制MATLAB命令工作区的所有数据。
在运行过程中,产生的所有变量均是命令工作区变量,这些变量一旦生成,就一直保存在内存空间中,除非用户执行clear命令将它们清除。运行一个脚本文件等价于从命令行窗口中顺序运行文件里的语句。由于脚本文件只是一串命令的集合,因此只需像在命令行窗口中输入语句那样,依次将语句编辑在脚本文件中即可。
【例】编程计算向量元素的平均值
在MATALB中输入以下代码
clear all
clc
a=input('输入变量:a=');
[b,c]=size(a);
if ~((b==1)|(c==1))|(((b==1)&(c==1))) %判断输入是否为向量
error('必须输入向量')
end
average=sum(a)/length(a) %计算向量a所有元素的平均值
运行后,系统提示
输入变量:a=
如果输入行向量[1 2 3],则运行结果为
average =
2
如果输入的不是向量,如[1 2;3 4],则运行结果为
必须输入向量
如果M文件的第一个可执行语句以function开始,该文件就是函数文件,每一个函数文件都定义一个函数。事实上,MATLAB 提供的函数命令大部分都是由函数文件定义的,这足以说明函数文件的重要。
通常函数文件由以下几个基本部分组成。
1.函数定义行:函数定义行由关键字function 引导,指明这是一个函数文件,并定义函数名、输入参数和输出参数,函数定义行必须为文件的第一个可执行语句,函数名与文件名相同,可以是MATLAB中任何合法的字符。
2.H1行:H1行就是帮助文本的第一行,是函数定义行下的第一个注释行,是供lookfor查询时使用的。一般来说为了充分利用MATLAB的搜索功能,在编制M 文件时,应在H1行中尽可能多地包含该函数的特征信息。由于在搜索路径上包含average 的函数很多,因此用lookfor average 语句可能会查询到多个有关的命令。
3.帮助文本:在函数定义行后面,连续的注释行不仅可以起到解释与提示作用,更重要的是为用户自己的函数文件建立在线查询信息,以供help命令在线查询时使用。
4.函数体:函数体包含了全部的用于完成计算及给输出参数赋值等工作的语句,这些语句可以是调用函数、流程控制、交互式输入/输出、计算、赋值、注释和空行。
5.注释:以%起始到行尾结束的部分为注释部分,MATLAB的注释可以放置在程序的任何位置,可以单独占一行,也可以在一个语句之后
调用函数文件的一般格式为:
[输出参数表]=函数名(输入参数表)
调用函数时应注意:
1.当调用一个函数时,输入和输出参数的顺序应与函数定义时的一致,其数目可以按少于函数文件中所规定的输入和输出参数调用函数,但不能使用多于函数文件所规定的输入和输出参数数目。
2.在编写函数文件调用时常通过nargin、nargout 函数来设置默认输入参数,并决定用户所希望的输出参数。函数nargin 可以检测函数被调用时用户指定的输入参数个数;函数nargout 可以检测函数被调用时用户指定的输出参数个数。
3.当函数有一个以上输出参数时,输出参数包含在方括号内。例如,[m,n]=size(x)。注意:[m,n]在左边表示函数的两个输出参数m 和n;不要把它和[m,n]在等号右边的情况混淆,如y=[m,n]表示数组y由变量m和n所组成。
4.当函数有一个或多个输出参数,但调用时未指定输出参数,则不给输出变量赋任何值。
5.函数有自己的独立工作区,它与MATLAB的工作区分开。
6.在MATLAB其他工作区重新定义预定义的变量,它不会延伸到函数的工作区;反之亦然,即在函数内重新定义预定义的变量不会延伸到MATLAB的其他工作区中。
7.如果变量说明是全局的,函数可以与其他函数、MATLAB命令工作区和递归调用本身共享变量。为了在函数内或MATLAB命令工作区中访问全局变量,全局变量在每一个所希望的工作区都必须说明。
8.全局变量可以为编程带来某些方便,但却破坏了函数对变量的封装,所以在实际编程中,无论什么时候都应尽量避免使用全局变量。如果一定要用全局变量,建议全局变量名要长、采用大写字母,并有选择地以首次出现的M文件的名字开头,使全局变量之间不必要的互作用减至最小。
9. MATLAB以搜寻脚本文件的同样方式搜寻函数文件。10.从函数文件内可以调用脚本文件。在这种情况下,脚本文件查看函数工作区,不查看MATLAB命令工作区。从函数文件内调用的脚本文件不必调到内存进行编译,函数每调用一次,它们就被打开和解释。因此,从函数文件内调用脚本文件减慢了函数的执行。
11.当函数文件到达文件终点,或者碰到返回命令return,就结束执行和返回。返回命令return提供了一种结束函数的简单方法,而不必到达文件的终点。
MATLAB中的函数可以分为:匿名函数、M文件主函数、嵌套函数、子函数、私有函数和重载函数。
匿名函数通常是很简单的函数。不像一般的M文件主函数要通过M文件编写,匿名函数是面向命令行代码的函数形式,它通常只由一句非常简单的语句,就可以在命令行窗口或M文件中调用函数,这对应那些函数内容非常简单的情况是很方便的。
创建匿名函数的标准格式是:
fhandle=@(arglist)expr
其中:
1.expr通常是一个简单的MATLAB变量表达式,实现函数的功能,比如x+x.^2等;
2.arglist是参数列表,它指定函数的输入参数列表,对应多个输入参数的情况,通常要用逗号分隔各个参数;
3.符号@是MATLAB中创建函数句柄的操作符,表示创建由输入参数列表arglist和表达式expr确定的函数句柄,并把这个函数句柄返回给变量fhandle,这样,以后就可以通过fhandle来调用定义好的这个函数。
每一个函数M文件第一行定义的函数就是M文件的主函数,一个M文件只能包含一个主函数,并通常习惯上将M文件名和M文件主函数名设为一致。
M文件主函数的说法是针对其内部嵌套函数和子函数而言的,一个M文件中除了一个主函数一维,还可以编写多个嵌套函数或子函数,以便在主函数功能实现中进行调用。
在一个函数内部,可以定义一个或多个函数,这种定义在其他函数内部的函数就被称为嵌套函数。嵌套可以多层发生,就是说一个函数内部就可以嵌套多个函数,这些嵌套函数内部又可以继续嵌套其他函数。
嵌套函数的互相调用需要注意,和嵌套的层次密切相关,如下面一段代码中:
1.外层的函数可以调用向内一层直接嵌套的函数(A可以调用B和C),而不能调用更深层次的嵌套函数(A不可以调用D和E);
2.嵌套函数可以调用与自己具有相同父函数的其他同层函数(B和C可以相互调用);
3.嵌套函数也可以调用其父函数,或与父函数具有相同父函数的其他嵌套函数(D可以调用B和C),但不能调用其父函数具有相同父函数的其他嵌套函数内深层嵌套的函数。
一个M文件只能包含一个主函数,但是一个M文件可以包含多个函数,这些编写在主函数后的函数都称为子函数。所有子函数只能被其所在M文件中的主函数或其他子函数调用。
私有函数是具有限制性访问权限的函数,它们对应的M文件需要保持在名为private的文件夹下,这些私有函数代码编写上和普通的函数没有什么区别,也可以在一个M文件中编写一个主函数和多个子函数,以及嵌套函数。但私有函数只能被private目录的直接父目录下的脚本M文件或M文件主函数调用。
通过help命令获取私有函数的帮助,也需要声明其私有特点,例如要获取私有函数myprifun的帮助,就要通过help private/myprifun命令。
重载是计算机编程中非常重要的概念,它经常的用在处理功能类似的,但参数类型或个数不同的函数编写中。
例如现在要实现一个计算功能,一种情况下输入的几个参数都是双精度浮点型,同时也有一种情况是输入几个参数都是整型变量,这时候,用户就可以编写两个同名函数,一个用来处理双精度浮点类型的输入参数,另一个用来处理整型的输入参数。这样,当用户实际调用函数时,MATLAB就可以根据实际传递的变量类型选择执行其中一个函数。
MATLAB中重载函数通常放置在不同的文件夹下,通常文件夹名称以符号@开头,然后跟一个代表MATLAB数据类型的字符,如@double目录下的重载函数输入参数应该是双精度浮点型,而@int32目录下的重载函数的输入参数应该是32为整型。
MATLAB中通过M文件编写函数时,只需要指定输入和输出的形式参数列表,只是在函数实际被调用的时候,才需要把具体的数值提供给函数声明中给出的输入参数。
MATLAB中参数传递过程是传值传递,也就是说,在函数调用过程中,MATLAB将传入的实际变量值赋值为形式参数指定的变量名,这些变量都存储在函数的变量空间中,这和工作区变量空间是独立的,每一个函数在调用中都有自己独立的函数空间。
MATLAB的函数可以具有多个输入或输出参数。通常在调用时,需要给出和函数声明语句中一一对应的输入参数;而输出参数个数可以按参数列表对应指定,也可以不指定。不指定输出参数调用函数时,MATLAB默认地把输出参数列表中的第一个参数的数值返回给工作区变量ans。
MATLAB中可以通过nargin和nargout函数,确定函数调用时实际传递的输入和输出参数个数,结合条件分支语句,就可以处理函数调用中指定不同数目的输入输出参数的情况。
函数nargin和nargout结合条件分支语句,可以处理可能具有不同数目的输入和输出参数的函数调用,但这要求对每一种输入参数数目和输出参数数目的结果分别进行代码编写。
有些情况下,用户可能并不能确定具体调用中传递的输入参数或输出参数的个数,即具有可变数目的传递参数,MATLAB中可通过varargin和varargout函数实现可变数目的参数传递,使用这两个函数对于处理具有复杂的输入输出参数个数组合的情况也是便利的。
函数varargin和varargout把实际的函数调用时的传递的参数值封装成一个元胞数组,因此,在函数实现部分的代码编写中,就要用访问元胞数组的方法访问封装在varargin和varargout中的元胞或元胞内的变量。
前面已经讲过,MATLAB函数有独立于MATLAB工作区的自己的变量空间,因此输入参数在函数内部的修改,都只具有和函数变量空间相同的生命周期,如果不指定将此修改后的输入参数值返回到工作区间,那么在函数调用结束后,这些修改后的值将被自动清除。
通过返回修改后的输入参数,可以实现函数内部对MATLAB工作区变量的修改,而另一种殊途同归的方法是使用全局变量,声明全局辨明需要用到的global关键词,语法格式为global variable。
通过全局变量可以实现MATLAB工作区变量空间和多个函数的函数空间共享,这样,多个使用全局变量的函数和MATLAB工作区共同维护这一全局变量,任何一处对全局变量的修改,都会直接改变此全局变量的取值。
以上就是今天学习的内容,希望对你有所帮助。