当前位置:文档之家› 第八章 程序设计

第八章 程序设计


子函数和私用(局部)函数
子函数 私用(局部)函数
子函数
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整个运行期间,可以产生 任意多个临时函数空间。 假如在函数文件中,发生对某脚本文件的调用,那么该脚本文件运行 产生的所有变量都存放于该函数空间之中,而不是存放在基本空间。
相关主题