首页 理论教育 如何编写函数M文件:从入门到实践

如何编写函数M文件:从入门到实践

时间:2023-07-02 理论教育 版权反馈
【摘要】:另外,用户还可通过编写函数M文件来扩展MATLAB的功能。设可逆矩阵A,编写同时求,A2,A-1,A′的函数M文件。局部变量在函数M文件内部声明并使用的变量均是局部变量,它和MATLAB工作区中的同名变量的存储位置不同,是完全不同的变量。

如何编写函数M文件:从入门到实践

函数M文件是由文本编辑器所创建的外部文本文件,同脚本M文件一样,不进入命令窗口。函数M文件不是独立执行的文件,它能够接受用户输入的参数进行计算,并将计算结果作为函数的返回值返回给调用者,但是在函数内存在的中间变量不出现在MATLAB工作空间。

事实上,MATLAB中含有多种不同类型的函数文件:内装函数文件、系统M函数文件、系统MEX函数文件、用户自定义MEX函数文件和用户自定义M函数文件。另外,用户还可通过编写函数M文件来扩展MATLAB的功能。

图3.1 用脚本文件绘制花瓣图案

1.函数M文件的结构

一个完整的函数M文件的结构如下:

因此,函数M文件通常由以下五个部分构成:

(1)函数定义语句

函数定义语句的格式为:

它表明该M文件包含一个函数,并且定义了函数名、输入和输出参数。

例如,“function f=fact(n)”就是函数fact的定义语句,存储在名为fact.m文件中。其中,function为关键词;f为输出参数;fact为函数名;n为输入参数。

函数文件可以带有多个输入和输出参数,如function[x,y,z]=sphere(theta,phi,rho);也可以没有输入或输出参数,如function sphere(x)。

【注】函数名和文件名必须相同。

(2)H1帮助行

H1帮助行是紧接函数定义语句后一行的注释语句,反映了M文件概括性的信息,一般包含大写的函数文件及功能简要描述。用户可以通过lookfor命令搜索所需函数,lookfor命令只检索和显示H1行,详见1.2.3小节

例如,在MATLAB命令行窗口中输入下面的命令:

在MATLAB的命令窗口中就会显示:

(3)帮助文本

帮助文本紧接在H1帮助行之后,用于详细介绍函数的功能和用法及其他说明,更重要的是,为用户自己的函数文件建立查询信息。用户可以通过命令help查询函数,在命令行窗口中查询函数的说明信息时,窗口会显示H1行与帮助文本的内容(help命令的使用详见1.2.3小节)。

例如,在MATLAB命令行窗口中输入下面的命令:

在MATLAB的命令窗口中就会显示:

(4)函数体

函数体是M文件的主要部分,完成函数的功能。在函数体中可以完成调用函数、流程控制、计算、赋值、注释等内容。

(5)注释语句

注释语句以%(百分号)开头,可以出现在一行的开始,也可以跟在一条可执行语句的后面,但必须在同一行。书写代码时,添加注释语句可以增加程序可读性,并且注释语句在编译程序时会被忽略,不会影响编译速度和程序运行速度。

【例3.2】 编写函数文件求解n!。

在程序编辑窗口中编写以下语句,并以jch.m为名存入相应的子目录。

在MATLAB命令行窗口中输入下面的命令:

MATLAB会出现相应的结果:

下面利用编写的jch函数来求解s=1!+2!+…+n!。

【例3.3】 设可逆矩阵A,编写同时求,A2,A-1,A′的函数M文件。

在程序编辑窗口中编写以下语句,并以comp4.m为名存入相应的子目录。

在MATLAB命令行窗口中输入下面的命令:

MATLAB会出现相应的结果:(www.xing528.com)

2.函数变量

MATLAB的变量不仅可以分为输入变量、输出变量和函数内部变量,还可以分为局部变量、全局变量和永久变量。

(1)局部变量

在函数M文件内部声明并使用的变量均是局部变量,它和MATLAB工作区中的同名变量的存储位置不同,是完全不同的变量。

每个函数都有自己的局部变量,这些变量存储在各自函数独立的工作区中,与其他函数的变量及主工作区中的变量分开存储。函数内部变量仅能在函数调用执行期间被使用,一旦函数调用结束,其占用的内存空间将被自动释放,内部变量随之删除。因此,除了函数返回值,被调用函数不改变工作区中其他变量的数值。

而脚本文件与函数文件不同,脚本文件没有独立的工作区。通过命令行窗口调用脚本文件时,脚本文件分享主工作区;当函数调用脚本文件时,脚本文件分享主调函数的工作区。如果脚本中改变了工作区中变量的值,则在脚本文件调用结束后,该变量的值发生改变。

【例3.4】 局部变量的示例。

在程序编辑窗口中编写以下语句,并以local.m为名存入相应的子目录。

在MATLAB命令行窗口中输入下面的命令并得出结果。

从上面的结果可知,函数调用结束后,执行whos无变量信息输出。因此,函数调用结束后,函数内部变量不改变主工作区中变量的值。

(2)全局变量

用户为了在整个MATLAB工作空间进行函数间变量的操作与数据共享,需要使用全局变量,可通过global函数来定义全局变量。全局变量的声明格式如下:

其含义是将变量1和变量2这两个变量定义为全局变量。

与局部变量不同,全局变量可以在定义该变量的全部工作区中有效。当在一个工作区内改变变量的值时,该变量在其他工作区中的变量值也同时发生改变。需要注意的是,任何函数在使用全局变量前必须先声明,即便是在命令行窗口中也不例外。如果一个M文件中包含的子函数需要访问全局变量,则需要在子函数中声明该变量;如果用户需要在命令行窗口中访问该变量,也需在命令行窗口中声明该变量。

值得注意的是,变量名的书写是区分大小写的,习惯上用大写字母来定义全局变量。

(3)永久变量

除了局部变量和全局变量外,MATLAB中还有一类变量被声明为persistent,译为永久变量。这类变量在函数退出时不被释放,当函数再次被调用时,这些变量保留上次函数退出时的数值。永久变量的声明格式如下:

例如:

永久变量具有以下特点:

永久变量与全局变量类似,但是只能在M文件内部定义,它的范围被限制在声明变量的函数内部,不允许其他函数对其进行改变。

只有该变量从属的函数能够访问该变量。

当函数运行结束时,永久变量的值保留在内存中。只要M文件还在MATLAB的内存中,永久变量就存在。因此,当用户再次调用该函数时,可再次利用这些永久变量。

3.函数参数的可调性

函数调用的变量不可多于函数M文件中所规定的输入和输出变量。如果输入与输出变量数多于M文件的函数定义句中所规定的数目,则调用时自动返回一个错误

在命令窗口中,函数调用的一般格式为:

例如:

在调用函数时,MATLAB用nargin和nargout两个函数分别记录调用该函数时的输入实参和输出实参的个数。只要在函数文件中包含这两个函数,就可以准确地知道该函数文件被调用时的输入、输出参数个数,从而决定如何处理函数。

在函数体内部用nargin(或nargout)确定用户提供的输入(或输出)参数个数。在函数体外部用nargin(或nargout)确定一个给定的函数的输入(或输出)参数的个数。如果函数的参数的数目是可变的,则返回一个负值。

函数的具体使用如下:

nargin(),nargout():返回输入、输出参数个数。

nargin(fun),nargout(fun):返回fun函数的输入、输出参数个数。

【注】nargin()和nargout()是函数而不是变量,用户不能对其进行重新赋值。

【例3.5】 nargin的用法示例。

在程序编辑窗口中编写以下语句,并以charray.m为名存入相应的子目录。

在MATLAB命令行窗口中输入下面的命令并得出结果。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈