2.9 MATLAB程序设计
2.9.1 MATLAB程序类型
MATLAB程序类型包括三种:一种是在命令窗口下执行的脚本M文件;另外一种是可以存取的M文件,即程序文件;最后一种是函数(function)文件。脚本M文件和程序文件中的变量都将保存在工作区中,这一点与函数文件是截然不同的。
- 脚本M文件
脚本M文件也称命令文件,它在命令窗口中输入并执行;没有输入参数,也不返回输出参数,只是一些命令行的组合;脚本M文件可对工作空间中的变量进行操作,也可生成新的变量;脚本M文件运行结束后,脚本M文件产生的变量仍将保留在工作空间中,直到关闭MATLAB或用相关命令删除。
- 程序文件
以.m格式进行存取,包含一连串的MATLAB指令和必要的注解。需要在工作空间中创建并获取变量,也就是说处理的数据为命令窗口中的数据,没有输入参数,也不会返回参数。程序运行时只需在工作空间中输入其名称即可。
在MATLAB命令窗口中选定“File”菜单“New””选项“M-file”即可建立M文件。也可选定“Edit”菜单建立M文件,选定“Save”选项即可保存文件。
选定MATLAB命令窗口中的“Edit”菜单可利用键盘编辑键对M文件进行全屏幕编辑。M文件以ASCII编码形式存储,在命令窗口中直接输入文件名就可执行M文件。
- 函数文件
与在命令窗口中输入命令一样,函数接受输入参数后执行并输出结果。用help命令可以显示它的注释说明。函数文件具有标准的基本结构。
(1)函数定义行(关键字function)。
- function[out1, out2,…]=filename(in1, in2,…)
输入和输出(返回)的参数个数分别由nargin和nargout两个MATLAB保留的变量给出。
(2)第一行帮助行,即H1行,以%开头,作为lookfor指令搜索的行。
(3)函数体说明及有关注解以%开头,用以说明函数的作用及有关内容,作为M文件的帮助信息。如果不希望显示某段信息,可在它的前面加空行。
(4)函数体语句:除返回和输入变量这些在function语句中直接引用的变量以外,函数体内使用的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在MATLAB的工作空间中清除。如果希望这些中间变量成为在整个程序中都起作用的变量,则可以将它们设置为全局变量。
2.9.2 MATLAB程序流程控制
MATLAB程序有顺序、分支、循环等程序结构以及子程序结构。
- 顺序程序结构
顺序程序结构的程序从程序的首行开始,逐行顺序往下执行,直到程序最后一行,大多数简单的MATLAB程序采用这种程序结构。
- 分支程序结构
分支程序结构的程序根据执行条件满足与否,确定执行方向。在MATLAB中,通过if-else-end结构、while结构、switch-case-otherwise结构来实现。
(1)if,else,elseif语句。
if条件语句用于选择结构。其格式有以下情况:
- ① if 逻辑表达式
- 执行语句
- end
- ② if 逻辑表达式
- 执行语句1
- else
- 执行语句2
- end
如果逻辑表达式的值为真,则执行执行语句1,然后跳过执行语句2,向下执行;如果为假,则执行执行语句2,然后向下执行。
- ③ if 逻辑表达式1
- 执行语句1
- elseif 逻辑表达式2
- 执行语句2
- end ...
如果逻辑表达式1的值为真,则执行执行语句1;如果为假,则判断逻辑表达式2,如果为真,则执行执行语句2,否则向下执行。
if条件语句可以嵌套使用,但是,必须注意if语句和end语句成对出现。
【例2-18】 if条件语句使用举例。
解:MATLAB程序代码如下。
- n=input('n=')
- if n<=0 A= 'negative' %判断输入数的正负性
- elseif isempty(n)==1 %判断输入是否为空
- A= 'empty'
- elseif rem(n, 2)==0 %除2取余数,判断奇偶性
- A= 'even'
- else
- A= 'odd'
- end
输出结果如下:
- n = A =
- [] even
- A = n =
- empty -4
- n = A =
- 4 negative
(2)switch语句。
基本格式:
- switch 表达式(%可以是标量或字符串)
- case 值1
- 语句1
- case 值2
- 语句2
- …
- otherwise
- 语句3
- end
表达式的值和哪种情况(case)的值相同,就执行哪种情况中的语句,如果不同,则执行otherwise中的语句。格式中也可以不包括otherwise,这时如果表达式的值与列出的各种情况都不相同,则继续向下执行。
- 循环程序结构
循环程序结构包括一个循环变量,循环变量从初始值开始计数,每循环一次就执行一次循环体内的语句,执行后,循环变量以一定的规律变化,然后再执行循环体内语句,直到循环变量大于循环变量的终止值为止。
常用的循环有while和for循环。while循环和for循环的区别在于:while循环结构的循环体被执行的次数不是确定的,而for结构中循环体的执行次数是确定的。
(1)for循环语句。for语句使用较为灵活,一般用于循环次数已经确定的情况,其格式为:
- for 循环变量=起始值:步长:终止值
- 循环体
- end
步长默认值为1,可以在正实数或负实数范围内任意指定。对于正数,循环变量的值大于终止值时,循环结束;对于负数,循环变量的值小于终止值时,循环结束。循环结构可以嵌套使用。书写格式不必太过于拘泥,在Editor编辑器中会自动进行处理。
for语句允许嵌套。在程序里,每一个“for”关键字必须和一个“end”关键字配对,否则程序执行时出错。
【例2-19】 for循环语句使用举例。
解:MATLAB程序代码如下。
- %计算出1~4的乘法表
- for n = 1:4
- for m=1:n
- r(n,m)=m*n
- end
- end
输出结果如下:
- r =
- 1 0 0 0
- 2 4 0 0
- 3 6 9 0
- 4 8 12 16
(2)while循环语句。while语句一般用于事先不能确定循环次数的情况,其基本格式为;
- while 表达式
- 循环体
- end
若表达式为真,则执行循环体的内容,执行后再判断表达式是否为真;若不为真,则跳出循环体,向下继续执行。在while语句的循环中,可用break语句退出循环。
【例2-20】 while循环语句使用举例。
解:MATLAB程序代码如下。
- %计算2000以内的fibnacci数
- f(1)=1
- f(2)=1
- i=1
- while f(i)+f(i+1)<2000
- f(i+2)=f(i)+f(i+1)
- i=i+1
- end
- f
程序的输出结果如下:
- i =
- 16
- f =
- Columns 1 through 8
- 1 1 2 3 5 8 13 21
- Columns 9 through 16
- 34 55 89 144 233 377 610 987
- Column 17
- 1597
2.9.3 MATLAB程序基本设计原则
MATLAB程序的基本设计原则如下所述:
(1)%后面的内容是程序的注解,要善于运用注解使程序更具可读性。
(2)养成在主程序开头用clear指令清除变量的习惯,以消除工作空间中其他变量对程序运行的影响,但注意在子程序中不要用clear。
(3)参数值要集中放在程序的开始部分,以便维护。要充分利用MATLAB工具箱提供的指令来执行所要进行的运算,在语句行之后输入分号使其及中间结果不在屏幕上显示,以提高执行速度。
(4)input指令可以用来输入一些临时的数据;对于大量参数,则通过建立一个存储参数的子程序,在主程序中通过子程序的名称来调用。
(5)程序尽量模块化,即采用主程序调用子程序的方法,将所有子程序合并在一起来执行全部的操作。
(6)充分利用Debugger来进行程序的调试(设置断点、单步执行、连续执行),并利用其他工具箱或图形用户界面(GUI)的设计技巧,将设计结果集成到一起。
(7)设置好MATLAB的工作路径,以便程序运行。
(8)MATLAB程序的基本组成结构如下所示:
- %说明
- 清除命令:清除Workspace中的变量和图形(clear,close)
- 定义变量:包括全局变量的声明及参数值的设定
- 逐行执行命令:指MATLAB提供的运算指令或工具箱提供的专用命令
- …
- 控制循环:包含for,if then,switch,while等语句
- 逐行执行命令
- …
- end
- 绘图命令:将运算结果绘制出来
当然,更复杂的程序还需要调用子程序,或者与Simulink及其他应用程序相结合。