第四讲 MATTLAB M文件和程序设计_图文

第二章 M文件和程序设计

主要内容
2.1 程序控制语句

2.2 命令文件和函数文件
2.3 字符串的求值 2.4 程序性能优化 2.5 面向对象编程

2.1 程序控制语句
一、分支控制
分支控制语句有if和switch两种语句 ?if结构 if expression commands end 【说明】 当表达式expression的值为真,则执行commands语句 组,否则跳过commands语句组,执行end之后的语句。

2.1 程序控制语句
?if-else结构
if expression commands1

【说明】
如果表达式expression的值为真, 则执行语句组 commands1,

else
commands2 end

然后跳过语句组commands2向下执行;
若表达式expression的值为假, 则跳过语句组commands1, 执行语句组commands2。

2.1 程序控制语句
?if-elseif-else结构 if expression_1 command_1 【说明】 如果表达式expression_1 的值为真,则执行语句组

elseif expression_2
command_2 ……

command_1,若表达式
expression_1的值为假, 则判断expression_2的值, 若为真,则执行语句组 command_2,否则向下 继续判断表达式。如果所 有表达式都为假,则执行

elseif expression_n
command_n else command_el end

语句组command_el。

2.1 程序控制语句
例2.1.1: 有分段函数
计算并显示函数值。
x ? ?1 ?3 x ? 4 ? ? f ( x ) ? ?e ? x ?1 ? x ? 1 ? x ?1 ?sin x ? cos x ?

编程输入x的值,

?switch-case结构 switch exp_const case value_1 commands_1 case value_2 commands_2 ┅ case value_n commands_n otherwise commands_ow end

2.1 程序控制语句
【说明】 ?表达式exp_const的值和哪一个case语句后的测试值相等,就执行

那个case语句下的语句组。如果exp_const和所有测试值都不相等,
就执行otherwise后的语句组commands_ow。 ?switch后的exp_const表达式可以为标量或者字符串。对于标量形 式,用关系运算符“= =”比较,对于字符串形式,用函数strcmp比较。 ?case语句后的value_n值可以是标量、字符串,也可以是细胞数组。 如果是细胞数组,Matlab会把表达式exp_const的值和 细胞数组中的每个元素比较,只要有一个元素和 exp_const值相同,比较结果就为相等。

2.1 程序控制语句
二、循环控制
?for循环 for x=Array

commands
end 【说明】 x称为循环变量,commands称为循环体。循环 的执行步骤是:循环变量从左到右依次取Array数

组的一列,每取一列就执行一次循环体,循环体
被执行的次数为Array的列数。for循环一般用于 循环次数已知的程序流程控制 。

2.1 程序控制语句
?while循环 while expression commands

end
【说明】 先判断表达式expression的值,如果其值为真,则执行 commands循环体;执行完循环体后,继续判断表达式 expression的值,直到表达式expression的值为假,结束循环。 while循环通常用在循环次数未知的情况下,而且要在循环体修改 循环表达式的值,否则容易造成死循环。

?break
从循环体中跳出,并使循环结束。

2.1 程序控制语句
例2.1.2:输入物品的标签号码,显示物品的种类。其中标签号码为1、 5、7的物品为食品,号码为10到19的物品为办公用品,号码

为20、24、28的为音像制品。
要求:不断从键盘输入标签号码,输入一个号码显示一次物 品种类,输入错误号码要给出提示,输入号码0则结束输入。

2.1 程序控制语句
三、异常检测
Matlab有异常处理机制,即可以检测某些语句的执行是否正

确,如果发生运行错误,Matlab的异常处理机制会捕捉到这个
错误,并跳转到用户指定的错误处理程序。 ?try-catch语句

try
commands catch handles end 【说明】 执行语句组commands,当语句组commands执行

发生错误时,跳转到错误处理语句组handles。(例4.1.3)

2.1 程序控制语句
四、其他程序流控制语句
?返回指令 return ?出错处理 error('message') errortrap lasterr 显示出错信息message,中止程序运行 发生错误后,程序继续执行或退出的状态切换 显示Matlab给出的最新的出错 信息,并中止程 序运行 强制结束函数或者命令的调用,将控制权交给主调函数

或者命令窗口。

2.1 程序控制语句
?警告处理 warning('message') lastwarn 显示警告信息message,程序继续运行 显示Matlab最新给出的警告信息,程序自动运行

五、人机交互控制
?input v=input(‘message’) 将用户键入的内容赋给变量v,messages是

显示信息
v=input(‘message’, ‘s’) 将用户键入的内容作为 字符串赋给变量v

2.1 程序控制语句
?keyboard 从键盘读入多个Matlab指令,直到用户输入return指令才返回。

?yesinput
v=yesinput('Prompt', default, posible) 【说明】

Prompt是显示在屏幕上的提示信息;default是缺省值,即如果没有键
盘输入时变量v赋值为default;posible是变量v可能接受的值。 ?pause pause pause(n) ?disp disp(X) 显示数组X的内容,但是不显示数组X的名字 暂停执行文件,等用户输入任意按键后继续执行 暂停n秒后,程序继续执行

2.2 命令文件和函数文件
用户可以把需要运行的Matlab指令保存在一个以“.m” 为扩展名的文件中,通过在命令窗口键入这个文件的名字来

运行文件中的Matlab指令,我们称这些文件为m文件。按照
m文件的组成和特点,可以分为命令文件和函数文件。

2.2 命令文件和函数文件
一、命令文件
有关命令文件的描述如下:
? 命令文件没有输入参数也没有输出参数,只是一些Matlab命令和 函数的组合; ? 命令文件可以操作基本工作空间(Base Workspace)的变量, 也可以生成新的变量。命令文件执行结束后新变量将保存在基本 工作空间中,不会被自动清除; ? 命令文件是用“.m”为扩展名的文件,只要命令文 件在搜索路径上,在命令窗口键入文件名就可以 运行命令文件。 例2.2.1:编写命令文件求解小于1000且为2的整数次幂

的正整数。

2.2 命令文件和函数文件
【说明】 ? M文件是一个文本文件,可以使用各种文本编辑器编辑和修改,也

可以使用MATLAB的M文件编辑器/调试器(Editor/Debugger);
? 在运行程序之前,一定要确定这个M文件是否在MATLAB的搜索路 径中。若不在,可以选择【File|Set Path】菜单,在路径设置对话 框中,加入该路径到所有搜索路径的最前端。一旦用【Set Path】 菜单设置了搜索路径后,Matlab会自动保存这些路径; ? 在MATLAB的命令窗口输入M文件名即可运行该命令文件; ? M文件运行过程中产生的变量会驻留在基本工作空间

中,即使文件运行结束也不会被自动删除,只有关闭
了MATLAB后基本工作空间才会被删除。

2.2 命令文件和函数文件
二、函数文件
函数文件的使用比命令文件更加灵活,能够更好的实现复杂问题的功 能模块划分。函数文件如同一个“黑箱子”,调用者仅仅需要把输入 变量传递给函数,就会得到函数的输出变量,即函数的运行结果。

对函数文件有如下的描述:
?函数文件要在第一行用function关键字来显式的定义; ?函数文件有输入变量和输出变量; ?函数文件的名字和第一行所定义的函数名相同; ?可以用比函数定义中数目少的输入变量和输出变量 来调用函数; ?函数文件内部定义的变量属于临时变量,只有函数

运行期间才被生成,函数运行结束后,这些临时变
量会被Matlab系统自动删除。

2.2 命令文件和函数文件
三、函数文件的组成
? 函数定义行 函数M文件的第一行用关键字“function”把M文件定义为一 个函数,指定函数的名字,同时定义了函数的输入变量和输 出变量。输入变量的定义用圆括号(),如果有多个输入变 量则用逗号分隔;输出变量的定义用中括号[ ],如果有多个输

出变量则用逗号分隔。
? H1行 所谓H1行指帮助文本的第一行,它紧跟在定义行之

后并以“%”符号开头,用于概括说明函数的功能。
在命令窗口用lookfor命令时将显示函数的H1行。

4.2 命令文件和函数文件
?函数帮助文本

帮助文本指位于H1行之后函数体之前的说明文本,它同样以“%”符
号开头,一般用来比较详细地介绍函数的功能、用法以及函数的修 改记录。在命令窗口用help命令时将显示函数的H1行和所有帮助文 本。 ?函数体 是函数的主体部分,函数的功能是通过函数体实现的。函数体可以 包括所有的Matlab合法命令、函数和流程控制语句。 例2.2.2:编写函数文件求 f (n) ? 1 ? 2 ? ... ? n

4.2 命令文件和函数文件
四、函数的输入变量和输出变量
1. 输入变量和输出变量的检测 检测输入变量和输出变量的函数,其格式和功能如下: n = nargin 用于函数内,返回实际输入变量的个数

n = nargin('fun')
n = nargout n = nargout('fun')

获取fun函数的声明的输入变量个数
用于函数体,返回实际输出变量的个数 获取fun函数的声明的输出变量个数

vname=inputname(n)

用于函数内,返回第n个输入变量的实际
调用变量名字

2. 数目可变的输入变量和输出变量 Matlab支持输入变量和输出变量数目可变的函数。 用户可以使用Matlab提供的两个指令来自己编写参 数数目可变的函数。

2.2 命令文件和函数文件
varargin varargout 【说明】 ? 编写参数数目可变的函数时,函数定义行的“数目可变的变量”要 放在“普通变量”之后; 数目可变的输入变量列表 数目可变的输出变量列表

? varargin的工作过程:
?varargin是一个细胞数组,里面放置的是“数目可变的变量”; ?函数被调用时,输入变量的传递规则是:实际输入变量依次逐个

传递 给函数定义的输入变量列表中的“普通输入变量”;
然后把剩余的实际输入变量依次传递给varargin细胞 数组中的细胞; ?varargin细胞数组中的细胞作为一个“普通输入变量” 来使用。

2.2 命令文件和函数文件
?varargout的工作过程和varargin类似,只是其对应的是函数的输

出变量。
例2.2.3 :用参数可变的方法定义一个绘制圆环的函数。其中

第一个输入变量为基圆半径,是必选的参数;第二
个输入变量为内圆半径,为可选参数;还可以输入 可选的图形属性控制字符串。如果有输出变量,则 不画图,只返回绘图数据;如果没有输出变量,则 绘制图形。

2.2 命令文件和函数文件
五、有关工作空间
1. 工作空间 有了函数文件后,工组空间会变得复杂起来。Matlab将工作空间分

成2类:
? 基本工作空间 基本工作空间是Matlab启动后自动创建的,只有关闭了Matlab后基

本工作空间才会被删除。基本工作空间内部包括Matlab建立的特殊
变量(如pi、i、j、NaN等)和命令窗口执行语句过程中生成的变量。 ? 函数工作空间 函数工作空间是函数文件运行时自动创建的工作空间, 它是临时的,当函数运行完毕后,会被系统自动撤销。 其中保存了函数内部定义或者运算生成的临时变量, 它们在函数执行完成后就不存在了。

2.2 命令文件和函数文件
2. 局部变量和全局变量 ?局部变量 存在于函数工作空间的临时变量(即函数内部定义的变量)称为局部 变量。局部变量只能被定义它的函数使用。 在函数的定义中,其输入变量和输出变量就是局部变量,即函数的输 入变量和输出变量只能在本函数内部被使用。 ?全局变量 通过global关键字可以定义全局变量。全局变量可以被所有工作空间 共享,即所有工作空间都可以访问全局变量,但是前 提是使用之前要先在工作空间内用global关键字声明 全局变量。建议在函数的开始处定义或声明全局变量,

全局变量的名字一般采用大写字母命名。

2.2 命令文件和函数文件
3. 跨工作空间的变量赋值 有些时候我们需要跨工作空间给变量赋值,Matlab提供了相关的函数。 格式: assignin('ws', 'var', val) 【说明】 把当前工作空间的变量val赋值给'ws'工作空间的名为'var'的变量。 其中,'ws'可以取: 'base' 表示基本工作空间 ‘caller’ 表主调函数工作空间

六、子函数和私有函数
如果一个项目比较复杂,就需要编写大量的函数 文件,这些函数文件通常都是该工程中专用的,其他程序 很少会用到。我们应该限制这些自编函数可以被调用的范 围,避免在Matlab基本工作空间中出现过多的标识符,尽 量避免在一个工作空间内出现同名函数。为了限制函数的 使用范围,Matlab支持子函数和私有函数。

2.2 命令文件和函数文件
1.子函数 Matlab允许一个函数文件内定义多个函数。其中,第一个定义的函数称 为主函数,其他的函数称为子函数。 关于主函数和子函数的描述如下:

?每个文件的第一行定义的是主函数;
?只有主函数可以被其他程序调用; ?函数文件的名字必须和主函数相同; ?子函数只能被处在同一个文件中的主函数或者其他子 函数调用; ?主函数和各个子函数的工组空间是彼此独立的,即每 个函数拥有自己独立的工作空间。

2.2 命令文件和函数文件
2.私有函数 私有函数是在函数M文件所在目录的private子目录中的函数M 文件,其性质如下: ?私有函数只能被private的直接父目录中定义的M文件调用, 其他目录的M文件或者命令窗口无权调用私有函数。 ? 私有函数的定义和构成和普通函数相同。 例2.2.4:编写函数文件求
f (n) ? ? k ! ? 1!? 2!? ... ? n !
k ?1 n

2.2 命令文件和函数文件
七、 M文件的执行
当Matlab遇到一个新的标识符corv时,它将按照下面步骤寻找这 个标识符。 ? 检查corv是否是一个变量名; ? 检查corv是否是内建函数名; ? 检查corv是否是子函数;

? 检查corv是否是私有函数;
? 检查corv是否是当前目录中的文件; ? 在Set Path指定的路径内搜索corv文件;

Matlab将使用最先找到的那个corv标识符。如果经过
上述步骤的搜索,也无法找到corv标识符,则给出提示 信息“??? Undefined function or variable 'corv'.”

2.3 字符串的求值
Matlab提供了字符串求值的函数,利用这些函数,可以用字符
串构造Matlab的函数和命令,并运行这些字符串命令。

一、eval
y=eval('expression') 计算字符串表达式expression
计算函数调用的字符串表达式 【注意】eval的输入变量只能是字符串 例2.3.1: 表达式字符串的计算 例2.3.2: eval和函数调用 [a1, a2, ...] = eval('function(b1, b2, ...) ')

2.3 字符串的求值
二、 feval
[y1, y2, ...] = feval('function', x1, ..., xn)
【说明】 ?'function'只能是函数名,不能是表达式字符串。 ?x1、x2等是调用函数'function'的输入变量,即函数的自变量值。 ?y1、y2等是函数的输出变量,即函数的返回值。 例2.3.3: feval的使用方法

2.3 字符串的求值
三、内联函数
用户可以用M文件来建立函数,函数的功能可以很复杂,函数的输 出变量也可以有多个。对于简单的数学表达式,用M文件来建立函数就 显得不够方便。Matlab提供了内联函数的功能,内联函数可以将表达式 转换为函数。内联函数是Matlab面向对象的一个类,其类型名为inline。 1.内联函数的建立

? g = inline('expr')
将串表达式expr转换为内联函数 ? g = inline('expr', 'arg1', 'arg2',...)

将串表达式expr转化为以arg1、arg2等为自变量(输
入变量)的 内联函数

2.3 字符串的求值
?g = inline('expr',n)

将串表达式expr转化为以自变量x,P1,P2,…,Pn为自变量的
内联函数。其中P必须大写。 例2.3.4:建立内联函数表示数学函数,并计算的值 例2.3.5:阅读下列程序代码,了解inline的使用方法。

2.3 字符串的求值
2. 和内联函数有关的函数 class(fun) char(fun) argnames(fun) vectorize(fun) %获取内联函数的数据类型 %获取内联函数的计算公式字符串 %获取内联函数的输入变量名字 %使内联函数具有数组运算规则

例4.3.6:阅读下列程序代码,了解和内联函数相关的函数的使用方法。

2.4 程序性能优化
Matlab语言是解释执行的语言,其优点是编程简单、使用方便,

但其缺点就是程序执行速度缓慢,执行效率低下。对于复杂的程序,
程序员要考虑程序性能的优化,让应用程序既能够完成预期的功能, 又具有较快的运行速度和较高的执行效率。

一、源代码级的优化
1. 循环的向量化 Matlab的运算功能是针对向量的,因此尽量少使用for循环和wile 循环,用向量化的数组代替单个元素的循环运算,即循环的向量化。

循环的向量化不但能缩短源代码的长度,还能加快
程序的运行速度,提高程序的执行效率。 例2.4.1:求log(n)在n从1到100之间的值,n为整数。

2.4 程序性能优化
2. 数组大小的预定义
Matlab在使用变量之前,不需要预先定义变量的名字和大小。如果 变量的大小没有被显示的指定,则每当新赋值的元素下标超过变量

的维数时,Matlab就自动为变量扩充维数,这大大降低了程序的运
行效率。如果预先知道变量的维数,就可以预先定义好变量尺寸, 通常采用ones、zeros或者cell等函数预定义变量维数。 例2.4.2:预定义变量维数编程

2.4 程序性能优化
3. 内存管理 Matlab系统的运行会占用大量的内存,在编写Matlab程序的时候要给 变量分派合理内存,提高内存使用效率,减少内存碎片产生。 ? 没有用的变量最好用clear语句删除 ? 尽量不产生大的临时变量

? 使用save和load命令保存和读取变量
? 尽量采用函数文件代替命令文件 4. 尽可能采用Matlab提供的函数

Matlab提供了大量的函数供用户调用,这些函数涵盖了
大多数的常用操作。要尽可能使用Matlab提供的函数, 不要自己编写具有和Matlab提供的函数具有相同功能 的代码,这样无论从效率、可靠性和开发时间上都是 得不偿失的。

2.4 程序性能优化
二、程序加速器
MATLAB提供了JIT(Just In Time)和加速器(Accelerator),用来加
快函数文件和命令文件的运行速度。JIT和加速器可以通过MATLAB 命令开启和关闭,默认情况下JIT和加速器都是启动的。

相关命令如下:
feature accel on feature accel off 开启加速器 关闭加速器

feature JIT on
feature JIT off

开启JIT
关闭JIT

2.5 面向对象编程
Matlab支持面向对象的程序设计方法,本节简单介绍Matlab中面向对象编 程的基本概念和应用方法。

一、 类和对象
类(Class)是一个抽象的概念,它是具有相同特征和行为的对象的集合。

对象(Object)是类的具体实例(Instance),相当于类集合中的具体元素。

例如:浮点数double是一个类,a=0.3定义了浮点数变量a,a就是浮点
数类的一个对象。 Matlab内建了5个类:

char、double、cell、struct、sparse、unit8
我们可以通过class函数来获取变量的数据类型, 其调用格式如下: str=class(v) %返回变量v的数据类型名称

2.5 面向对象编程
二、 属性和方法
类中封装了该类对象共有的特征和行为。
属性(Property) 对象的特征称为属性,用数据来表示。对象的属性通常用结构体来 描述,因此我们访问对象的属性可以象访问结构体的一样用成员运算符

“.”来访问,也可以用get和set函数来访问对象的属性。
get(h,‘PropertyName’) 返回对象h的PropertyName属性的值 set(H,'PropertyName', Value,...)

赋值H对象的PropertyName‘属性值为Value。
方法(Method) 对象的行为称为方法,用函数来表示。某个类的方法 只能操作该类的对象。

2.5 面向对象编程
三、构造函数
Matlab中没有类的声明语句。定义对象要调用类的构造函数
(Constructor)。构造函数的名字必须与类同名,比如cell函数和struct 函数就分别是细胞数组类和结构体数组类的构造函数。 c=cell(3,3); %调用构造函数cell建立一个3×3的细胞数组

四、 重载
一些行为具有相同的定义,但实现方法不同,我们可以用同样名称的方法 来描述这些操作,这种技术称为重载。被重载的函数具有相同的名字,但是对 不同对象操作的时候表现出来的行为是不同的,调用的函数代码也不同。 重载包括函数重载和运算符重载。例如:乘法运算符 “*”就被Matlab重载过,分别用来实现矩阵乘法和传递系 统的串联操作;eig函数也被重载,用来实现矩阵和线性时 不变系统的特征值操作。

2.5 面向对象编程
五、继承
动物类和哺乳动物类就是被继承和继承的关系,哺乳动物类继承了
动物类的一切特征和行为,也就是说动物有的特征哺乳动物都有,但是 哺乳动物还有自己特有的特征和行为。这种关系我们称为继承关系,动

物类称为是哺乳动物类的父类,哺乳动物类称为是动物类的子类。
子类会继承父类的属性和方法,同时还会有自己的新属性和新方法。 继承的使用能够提高代码的重用性,减少编程工作量。

2.5 面向对象编程
六、 建立一个新类
除了Matlab内建的类之外,用户可以根据实际应用情况创建新类。 创建一个新类的基本工作包括如下方面: 1.创建类目录 在Matlab的搜索路径上创建一个子目录,子目录的名字为@加上类 名,这个目录称为类目录,该类的代码就放在类目录下。 2.创建类的属性数据 类的属性用结构体来表示,抽象出该类共有的特征 定义为结构体成员。

2.5 面向对象编程
3.编写类的构造函数 用户通过调用和类同名的构造函数来创建类的对象。 4.重载类的显示函数display

用来实现Matlab调用属于该类的方法时,如何处理屏幕上的显
示内容,即用分号和逗号结尾的语句如何显示调用的结果。 5.添加强制数据转换方法

添加必要的强制转换方法,将该类的对象转换为其他类型的数据。
6.重载需要的运算符和函数 7.添加类的其他方法

习题
2.1 一个3位整数各位数字的立方和等于该数本身则称该数

为水仙花数。输出100~999之间的全部水仙花数。
2.2 编写函数文件求半径为r的圆的面积和周长。 2.3 已知
y? 1 1 1 1 ? 2 ? 2 ? ...... 2 12 2 3 n

,当x=100时,求y的值。

2.4 利用函数的递归调用,求 n! 。 2.5 编制程序,计算1+2+…+n<2000时的最大n值。 2.6 分别用for和while循环结构编写程序, 63 求出K= ? 2 i 。
i ?0


相关文档

第四章M文件和程序设计
第四章 M文件和程序设计
4章M文件和程序设计
m文件与程序设计2010
第4章 MATLAB程序设计和M文件
05 程序设计和M文件
第7、8章 M文件程序设计和应用程序接口
基础篇2,M文件及程序设计基础
M文件和面向对象编程
电脑版