2.9 MATLAB程序设计

2.9.1 MATLAB程序类型

MATLAB程序类型包括三种:一种是在命令窗口下执行的脚本M文件;另外一种是可以存取的M文件,即程序文件;最后一种是函数(function)文件。脚本M文件和程序文件中的变量都将保存在工作区中,这一点与函数文件是截然不同的。

  1. 脚本M文件

脚本M文件也称命令文件,它在命令窗口中输入并执行;没有输入参数,也不返回输出参数,只是一些命令行的组合;脚本M文件可对工作空间中的变量进行操作,也可生成新的变量;脚本M文件运行结束后,脚本M文件产生的变量仍将保留在工作空间中,直到关闭MATLAB或用相关命令删除。

  1. 程序文件

以.m格式进行存取,包含一连串的MATLAB指令和必要的注解。需要在工作空间中创建并获取变量,也就是说处理的数据为命令窗口中的数据,没有输入参数,也不会返回参数。程序运行时只需在工作空间中输入其名称即可。

在MATLAB命令窗口中选定“File”菜单“New””选项“M-file”即可建立M文件。也可选定“Edit”菜单建立M文件,选定“Save”选项即可保存文件。

选定MATLAB命令窗口中的“Edit”菜单可利用键盘编辑键对M文件进行全屏幕编辑。M文件以ASCII编码形式存储,在命令窗口中直接输入文件名就可执行M文件。

  1. 函数文件

与在命令窗口中输入命令一样,函数接受输入参数后执行并输出结果。用help命令可以显示它的注释说明。函数文件具有标准的基本结构。

(1)函数定义行(关键字function)。

  1. function[out1, out2,…]=filename(in1, in2,…)

输入和输出(返回)的参数个数分别由nargin和nargout两个MATLAB保留的变量给出。

(2)第一行帮助行,即H1行,以%开头,作为lookfor指令搜索的行。

(3)函数体说明及有关注解以%开头,用以说明函数的作用及有关内容,作为M文件的帮助信息。如果不希望显示某段信息,可在它的前面加空行。

(4)函数体语句:除返回和输入变量这些在function语句中直接引用的变量以外,函数体内使用的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在MATLAB的工作空间中清除。如果希望这些中间变量成为在整个程序中都起作用的变量,则可以将它们设置为全局变量。

2.9.2 MATLAB程序流程控制

MATLAB程序有顺序、分支、循环等程序结构以及子程序结构。

  1. 顺序程序结构

顺序程序结构的程序从程序的首行开始,逐行顺序往下执行,直到程序最后一行,大多数简单的MATLAB程序采用这种程序结构。

  1. 分支程序结构

分支程序结构的程序根据执行条件满足与否,确定执行方向。在MATLAB中,通过if-else-end结构、while结构、switch-case-otherwise结构来实现。

(1)if,else,elseif语句。

if条件语句用于选择结构。其格式有以下情况:

  1. if 逻辑表达式
  2. 执行语句
  3. end
  4. if 逻辑表达式
  5. 执行语句1
  6. else
  7. 执行语句2
  8. end

如果逻辑表达式的值为真,则执行执行语句1,然后跳过执行语句2,向下执行;如果为假,则执行执行语句2,然后向下执行。

  1. if 逻辑表达式1
  2. 执行语句1
  3. elseif 逻辑表达式2
  4. 执行语句2
  5. end ...

如果逻辑表达式1的值为真,则执行执行语句1;如果为假,则判断逻辑表达式2,如果为真,则执行执行语句2,否则向下执行。

if条件语句可以嵌套使用,但是,必须注意if语句和end语句成对出现。

【例2-18】 if条件语句使用举例。

解:MATLAB程序代码如下。

  1. n=input('n=')
  2. if n<=0 A= 'negative' %判断输入数的正负性
  3. elseif isempty(n)==1 %判断输入是否为空
  4. A= 'empty'
  5. elseif rem(n, 2)==0 %除2取余数,判断奇偶性
  6. A= 'even'
  7. else
  8. A= 'odd'
  9. end

输出结果如下:

  1. n = A =
  2. [] even
  3. A = n =
  4. empty -4
  5. n = A =
  6. 4 negative

(2)switch语句。

基本格式:

  1. switch 表达式(%可以是标量或字符串)
  2. case 1
  3. 语句1
  4. case 2
  5. 语句2
  6. otherwise
  7. 语句3
  8. end

表达式的值和哪种情况(case)的值相同,就执行哪种情况中的语句,如果不同,则执行otherwise中的语句。格式中也可以不包括otherwise,这时如果表达式的值与列出的各种情况都不相同,则继续向下执行。

  1. 循环程序结构

循环程序结构包括一个循环变量,循环变量从初始值开始计数,每循环一次就执行一次循环体内的语句,执行后,循环变量以一定的规律变化,然后再执行循环体内语句,直到循环变量大于循环变量的终止值为止。

常用的循环有while和for循环。while循环和for循环的区别在于:while循环结构的循环体被执行的次数不是确定的,而for结构中循环体的执行次数是确定的。

(1)for循环语句。for语句使用较为灵活,一般用于循环次数已经确定的情况,其格式为:

  1. for 循环变量=起始值:步长:终止值
  2. 循环体
  3. end

步长默认值为1,可以在正实数或负实数范围内任意指定。对于正数,循环变量的值大于终止值时,循环结束;对于负数,循环变量的值小于终止值时,循环结束。循环结构可以嵌套使用。书写格式不必太过于拘泥,在Editor编辑器中会自动进行处理。

for语句允许嵌套。在程序里,每一个“for”关键字必须和一个“end”关键字配对,否则程序执行时出错。

【例2-19】 for循环语句使用举例。

解:MATLAB程序代码如下。

  1. %计算出14的乘法表
  2. for n = 1:4
  3. for m=1:n
  4. r(n,m)=m*n
  5. end
  6. end

输出结果如下:

  1. r =
  2. 1 0 0 0
  3. 2 4 0 0
  4. 3 6 9 0
  5. 4 8 12 16

(2)while循环语句。while语句一般用于事先不能确定循环次数的情况,其基本格式为;

  1. while 表达式
  2. 循环体
  3. end

若表达式为真,则执行循环体的内容,执行后再判断表达式是否为真;若不为真,则跳出循环体,向下继续执行。在while语句的循环中,可用break语句退出循环。

【例2-20】 while循环语句使用举例。

解:MATLAB程序代码如下。

  1. %计算2000以内的fibnacci
  2. f(1)=1
  3. f(2)=1
  4. i=1
  5. while f(i)+f(i+1)<2000
  6. f(i+2)=f(i)+f(i+1)
  7. i=i+1
  8. end
  9. f

程序的输出结果如下:

  1. i =
  2. 16
  3. f =
  4. Columns 1 through 8
  5. 1 1 2 3 5 8 13 21
  6. Columns 9 through 16
  7. 34 55 89 144 233 377 610 987
  8. Column 17
  9. 1597

2.9.3 MATLAB程序基本设计原则

MATLAB程序的基本设计原则如下所述:

(1)%后面的内容是程序的注解,要善于运用注解使程序更具可读性。

(2)养成在主程序开头用clear指令清除变量的习惯,以消除工作空间中其他变量对程序运行的影响,但注意在子程序中不要用clear。

(3)参数值要集中放在程序的开始部分,以便维护。要充分利用MATLAB工具箱提供的指令来执行所要进行的运算,在语句行之后输入分号使其及中间结果不在屏幕上显示,以提高执行速度。

(4)input指令可以用来输入一些临时的数据;对于大量参数,则通过建立一个存储参数的子程序,在主程序中通过子程序的名称来调用。

(5)程序尽量模块化,即采用主程序调用子程序的方法,将所有子程序合并在一起来执行全部的操作。

(6)充分利用Debugger来进行程序的调试(设置断点、单步执行、连续执行),并利用其他工具箱或图形用户界面(GUI)的设计技巧,将设计结果集成到一起。

(7)设置好MATLAB的工作路径,以便程序运行。

(8)MATLAB程序的基本组成结构如下所示:

  1. %说明
  2. 清除命令:清除Workspace中的变量和图形(clear,close)
  3. 定义变量:包括全局变量的声明及参数值的设定
  4. 逐行执行命令:指MATLAB提供的运算指令或工具箱提供的专用命令
  5. 控制循环:包含for,if then,switch,while等语句
  6. 逐行执行命令
  7. end
  8. 绘图命令:将运算结果绘制出来

当然,更复杂的程序还需要调用子程序,或者与Simulink及其他应用程序相结合。