MATLAB基础及应用(第5版)
上QQ阅读APP看书,第一时间看更新

2.3 函数文件

函数文件是另一种形式的 M 文件,每一个函数文件都是定义的一个函数。事实上,MATLAB提供的标准函数大部分都是由函数文件定义的,这足以说明函数文件的重要性。从使用的角度看,函数是一个“黑箱”,把一些数据送进去,经加工处理,把结果送出来。从形式上看,函数文件区别于命令文件之处,在于命令文件的变量在文件执行完成后保留在工作空间中,而函数文件内定义的变量,只在函数文件内部起作用,当函数文件执行完后,这些内部变量将被清除。因此,在应用函数文件时,只关心函数的输入和输出。

2.3.1 基本结构

函数文件由关键字function引导,其基本结构为:

说明:以function开头的一行为引导行,表示该文件是一个函数文件。函数名的命名规则与变量名相同。输入形参表是函数的输入参数,可以有多个,用 “逗号” 来分隔;输出形参表为函数的输出参数,当输出形参只有一个时,直接输入变量名而不用方括号,多个输出形参用 “逗号” 来分隔。

注意:函数文件编辑结束后,不能像M文件那样单击 〈F5〉 键或单击 “运行” 按钮,而是要直接存盘。

(1)函数文件名

函数文件名通常由函数名再加上扩展名m组成,不过函数文件名与函数名也可以不相同。当两者不同时,MATLAB将忽略函数名而使用函数文件名,调用函数时以函数文件名为依据。因此,最好把函数文件名和函数名统一,以免出错。

(2)注释说明

注释说明包括以下3部分内容。

1)紧随函数文件定义行之后,以%开头的第一行。这一行一般包括大写的函数文件名和函数功能的简要描述,供lookfor关键词查询和help在线帮助用。

2)第一行之后连续的注释行。通常包括函数输入、输出参数的含义及调用格式说明等信息,构成全部在线帮助文本。

3)与在线帮助文本相隔一个空行的注释行。包括函数文件编写和修改的信息,如作者、修改日期、版本等内容,用于软件档案管理。

(3)return语句

如果在函数文件中插入了return语句,则执行到该语句就结束函数的执行,程序流程转到调用该函数的位置。通常在函数文件中缺省return语句,这时在被调函数执行完成后自动返回。

2.3.2 函数调用

函数文件编制好后,就可以调用函数进行计算了。函数调用的一般格式为:

需要注意的是,函数调用时各实参出现的顺序、个数,应与函数定义时形参的顺序、个数一致,否则会出错。函数调用时,先将实参传递给相应的形参,从而实现参数传递,然后再执行函数的功能。

例2-12】 编写一个函数文件,函数文件和函数名均为datfunction.m,对输入的两个数进行加、减运算。

打开文本编辑器或单击 “新建”→“脚本”,输入以下程序:

直接存盘后,在MATLAB的命令行窗口调用该函数文件:

也可以通过help来了解该函数,例如在命令行窗口输入:help datfunction,单击〈Enter〉 键后,显示:“这是一个计算两个数和、差的函数。”

在MATLAB中,函数可以嵌套调用,即一个函数可以调用别的函数,甚至调用自身。在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

例2-13】 有5个人坐在一起,问第5 个人多少岁,他说比第4个人大2岁;问第4个人岁数,他说比第3个人大2岁;问第3个人岁数,他说比第2个人大2岁;问第2个人岁数,他说比第1个人大2岁;最后问第1个人岁数,他说是12岁。求第5个人多大?

打开文本编辑器或单击 “新建” → “脚本”,输入以下程序:

直接存盘后,在MATLAB的命令行窗口调用该函数文件:

当函数调用完毕后,可以用who或whos查看工作空间中的变量,也可以查看工作空间窗口(workspace),会发现在工作空间窗口只有 hisage一个变量存在,函数调用过程中的变量都已经释放。函数有自己的专用工作空间,函数内变量与MATLAB工作空间之间唯一的联系是函数的输入和输出参数。如果函数的输入参数值发生变化,其变化仅在函数内出现,不影响MATLAB工作空间的其他变量。函数内所创建的变量只驻留在函数的工作空间,而且只在函数执行期间临时存在,函数调用结束后就释放了。

2.3.3 参数的可调性

MATLAB在函数调用上有一个与一般高级语言不同之处,就是函数所传递参数数目的可调性。凭借这一点,一个函数可完成多种功能。在调用函数时,MATLAB用两个永久变量nargin和 nargout分别记录调用函数时的输入实参和输出实参的个数。只要在函数文件中包含这两个变量,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理。

例2-14】 编写一个函数文件test,比较输入1个参数、2个参数和3个参数时的结果。

在命令行窗口输入以下内容:

2.3.4 全局变量

由于函数文件定义的内部变量只在该函数内有效,这些变量不能直接被另一个函数文件所使用。为了解决这个问题,MATLAB使用全局变量。全局变量的作用域是整个MATLAB工作空间,即全程有效,所有的函数都可以对其进行存取和修改,因此定义全局变量是函数间传递信息的一种手段。在函数文件里,全局变量的定义语句应放在变量使用之前,为了便于了解所有的全局变量,一般把全局变量的定义语句放在文件的前部。定义全局变量的方法是使用global函数,其格式为:

值得指出,在程序设计中,全局变量固然可以带来某些方便,但却破坏了函数对变量的封装,降低了程序的可读性。因而,在结构化程序设计中,全局变量是不受欢迎的。尤其当程序较大,子程序较多时,全局变量将给程序调试和维护带来不便,故不提倡使用全局变量。如果一定要用全局变量,最好起一个能反映变量含义的名字,以免和其他变量混淆,全局变量名多用大写字母,并有选择地以首次出现的M文件的名字开头,这样,可把多个全局变量之间不必要的互作用减至最小。

例2-15】 建立一个函数文件sub,比较下面两个文件的运行结果,说明全局变量的作用。函数文件如下:

将sub文件保存后,输入文件1:

运行文件1后,激活命令行窗口,观看运行结果为:

接下来输入文件2,内容如下:

运行文件2后激活命令行窗口,观看运行结果为:

注意:运行完文件1,再运行文件2时,一定要在文件2的开头加上clear函数,否则结果相同,因为全局变量X已经在工作空间内。