第八章 程序设计
子函数和私用(局部)函数
子函数 私用(局部)函数
子函数
MATLAB允许一个M函数文件包含多个 函数的代码。其中,第一个出现的函数 称为主函数(Primary function),该文件 中的其他函数称为子函数(Subfunction)。 保存时所用的函数名与主函数定义名相 同。外部程序只能对主函数进行调用。 子函数的性质:
inputname(n)
跨空间变量传递
跨空间计算串表达式的值 跨空间赋值
跨空间计算串表达式的值
前面已介绍了实现不同工作空间之间变量传递的两种 渠道:函数的输入输出宗量和全局变量。下面介绍第 三个传递渠道:跨空间计算串表达式值的指令。
evalin(„workspace‟,‟expression‟)
它只是一串按用户意图排列而成的(包括控制流向指 令在内的)MATLAB指令集。 脚本文件运行后,所产生的所有变量都驻留在 MATLAB基本工作空间(Base workspace)中。只要不 使用clear指令加以清除,且MATLAB指令窗不关闭, 这些变量将一直保存在基本工作空间中。基本工作空 间随MATLAB的启动而产生;只有关闭MATLAB时, 该基本空间才被删除。
M函数文件示例
函数申明(定义)行 (Function declaration line):
位于函数文件的首行,以MATLAB关键字 function开头,函数名以及函数的输入输出 宗量都在这一行定义。
H1行(The first help text line):
紧随函数申明行之后以%开头的第一注释行。 按MATLAB自身文件的规则,H1行包含: 大写体的函数文件名;运用关键词简要描述 的函数功能。该H1行供lookfor关键词查询 和help在线帮助使用。
子函数的性质:
每个子函数的第一行是其自己的函数申明行。 在M函数文件内,主函数的位置不可改变,但子函数的 排列次序可任意改变。 子函数只能被处于同一文件的主函数或其他子函数调用。 在M函数文件中,任何指令通过“名字”对函数进行调 用时,子函数的优先级仅次于内装函数。 同一文件的主函数、子函数的工作空间都是彼此独立的。 各函数间的信息,或通过输入输出宗量传递,或通过全 局变量传递,或通过跨空间指令传递。 help,lookfor等帮助指令都不能提供关于子函数的任何帮 助信息。 涉及子函数的算例。
输入输出宗量检测指令 跨空间变量传递 子函数和私用函数
输入输出宗量检测指令
nargin 在函数体内,用于获取实际输入宗量 nargout 在函数体内,用于获取实际输出宗量 nargin(„fun‟) 获取‘fun‟指定函数的标称输入宗量
数
nargout(„fun‟)
出
获取‘fun‟指定函数的标称输 宗量数 在函数体内使用,给出第n个 输入宗量的实际调用变量名
为清晰起见,它与前面的注释行以空行相隔。 这部分内容由实现该M函数文件功能的 MATLAB指令组成。它接收输入宗量,进 行程序流控制,得到输出宗量。其中为阅读、 理解方便,也配置适当的空行和注释。若仅 从运算角度看,惟有函数申明行和函数体两 部分是构成M函数文件所必不可少的。
5、变量的检测传递和限权使用函数
for循环结构 while循环结构 if-else-end分支结构 switch-case结构 try-catch结构 控制程序流的其它常用指令
1、for循环结构
for x=array (commands) end
For循环的结构以及含义和其他高级语言的结 构和含义基本一致。 一个简单的for循环示例。 和其他语言一样for循环可以有多重循环。
稀疏 sparse
数据文件
MATLAB允许接受的数据文件大致可分 为以下几类:
以.mat为扩展名的二进制数据文件。 以.txt、.dat为扩展名的ASCII码数据文件。 以.bmp、.jpg、.tif等为扩展名的图像文件。 以.wav为扩展名的声音文件。
P192/表8-3
三、MATLAB控制流
帮助信息。
二、MATLAB的数据类型
6种基本数据类型及若干衍生类型。
数据类型 Data Types
数值 Numeric
字符串 Char
元胞 Cell
构架 Structure
函数句柄 Function handle
JAVA类 JAVA Class
双精度 double
单精度 single
整数类 Int*,uint*
第八章 M文件程序设计基础
M文本编辑器 M文件 MATLAB的数据类型 MATLAB控制流 程序调试 函数句柄
一、M文件
M脚本(命令)文件 M函数文件 局部变量和全局变量 M文件的一般结构 变量的检测传递和限权使用函数
1、M脚本(命令)文件(Script)
“脚本”本身反映这样一个事实:MATLAB只是 按文件所写的指令执行。 M脚本(命令)文件的构成较简单,其特点是:
try (commands1) catch (commands2) end
私用(局部)函数
所谓私用(局部)函数,是指位于private目录 上的M文件函数。 私用(局部)函数的性质:
私用(局部)函数的构造与普通M函数完全相同。 私用(局部)函数的只能被private目录的直接父目录 上的M函数文件所调用。它不能被其他目录上的任何 M函数、M脚本文件或MATLAB指令窗中的命令所 调用,也不能被直接父目录上的M脚本文件调用。 M文件中,任何指令通过“名字”对函数进行调用时, 私用(局部)函数的优先级虽低于内装函数和子函数, 但高与其他任何目录上的函数。 help,lookfor等指令都不能提供关于私用(局部)函数的任何
跨空间计算串表达式值 说明: ‘workspace‟可取两个值:‘base‟和‘caller‟ 该调用格式的执行机理:
当‘workspace‟取‘base‟表示计算eval(„expression‟)时, 将从基本工作空间获得变量值。 当‘workspace‟取‘caller‟表示计算eval(„expression‟)时, 将从主调函数工作空间获得变量值。主调函数是相对被调 函数而言的。这里,被调函数是指evalin所在的函数。
4、switch-case结构
switch ex case test1 (commands1) case test2 (commands2) … case testk (commandsk) otherwise (commands) end
例:学生成绩管理,用来演示switch结构的应用。
5、try-catch结构
2、while循环结构
while expression (commands) end
与for循环设置固定循环次数来执行循环体相比 较,MATLAB中的while循环是应用逻辑表达式 来设置与判断是否执行循环体,循环次数依逻 辑判断条件来决定,循环次数是不固定的。 例:Fibonacci数组的元素满足Fibonacci规则: a k+2=ak+ak+1,(k=1,2,…);且a1=a2=1。现要求该数 组中第一个大于10000的元素。
3、if-else-end分支结构
if-else-end指令为程序流提供了一种分支结构,它最常 用的使用方式:
单分支 if expression (commands) end 双分支 if expression (commands1) else (commands2) end 多分支 if expression1 (commands1) elseif expression2 (commands2) … else (commandsk) end
例: evalin运行机理与eval的异同。
跨空间赋值
实现不同工作空间之间变量传递的第四个 传递渠道是跨空间赋值指令: assignin(„workspace‟,‟VN‟,x)
跨空间向VN变量赋值
说明:把当前工作空间内变量x的值赋给 ‘workspace‟指定空间名的VN变量。
例:assignin运作机理示范
在线帮助文本(Help text)区:
H1行及其之后的连续以%开头的所有注释 行构成整个在线帮助文本。它通常包括:函 数输入输出宗量的含义,调用格式说明。
编写和修改记录:
与在线帮助文本区相隔一个空行,也以%开 头,标志编写及修改该M文件的作者和日期、 版本记录。它用于软件档案管理。
函数体(Function body):2、函数文件( Function)
与脚本(命令)文件不同,函数文件(Function file)犹如一个“黑箱”。从外界只能看到传给 它的输入量和送出来的计算结果,而内部运作 是藏而不见的。
函数文件的特点:
从形式上看,与脚本文件不同,函数文件的第一行总是以“function” 引导的“函数申明行”(Function declaration line)。该行还罗列出函数 与外界联系的全部“标称”输入输出宗量。但对“输入输出宗量”的 标称数目并没有限制,即可以完全没有输入输出宗量,也可以是任意 数目。 MATLAB允许使用比“标称数目”较少的输入输出宗量,实现对函数 的调用。 从运行上看,与脚本文件运行不同,每当函数文件运行,MATLAB就 会专门为它开辟一个临时工作空间,称之谓函数工作空间(Function workspace)。所有中间变量都存放在函数工作空间中。当执行完文件 最后一条指令或遇到return时,就结束该函数文件的运行,同时该临 时函数空间及其所有的中间变量就立即被清除。 函数空间随具体M函数文件的被调用而产生,随调用结束而删除。函 数空间是相对独立的、临时的。在MATLAB整个运行期间,可以产生 任意多个临时函数空间。 假如在函数文件中,发生对某脚本文件的调用,那么该脚本文件运行 产生的所有变量都存放于该函数空间之中,而不是存放在基本空间。