Matlab R2016a从入门到精通 (CAX工程应用丛书)
上QQ阅读APP看书,第一时间看更新

4.2 程序控制

MATLAB平台上的控制流结构包括顺序结构、分支结构和循环结构,这些结构的算法及使用与其他计算机编程语言十分相似。

4.2.1 顺序结构

顺序结构是程序最基本的结构,表示程序中的各操作是按照它们在程序文本中出现的先后顺序执行的。

顺序结构可以独立使用构成一个简单的完整程序。大多数情况下,顺序结构作为程序的一部分,与其他结构一起构成一个复杂的程序。

例4-4,顺序结构示例。

在命令行窗口输入:

    a=1
    b=5
    c=a/b

输出结果如下:

    a =      1
    b =      5
    c =     0.2000

以上程序顺序执行,并顺序输出相应结果。

4.2.2 分支结构

MATLAB中可用的分支结构有三种,分别为if-else-end结构、switch-case结构和try-catch结构。

1.if-else-end结构

if-else-end结构的主要形式有以下三种:

(1)如果可选择的执行命令组只有一组,则调用下面的结构:

    if expression
        commands           %判决条件为真,执行命令组commands
    end

注意

若判决条件expression为一个空数组,则在MATLAB中默认该条件为假。

(2)如果可选择的执行命令组有两组,则调用下面的结构:

    if expression               %判决条件
            commands1    %判决条件为真,执行命令组commands1
    else
            commands2    %判决条件为真,执行命令组commands2
    end

(3)如果可选择的执行命令组有n(n>2)组,则调用下面的结构:

    if expression1              %判决条件
            commands1    %判决条件expression1为真,执行commands1
    elseif expression2
            commands2    %判决条件expression1为假,expression2为真,执行commands2
    …
    else
            commandsn    %前面所有判决条件均为假,执行commandsn
    end

注意

判决条件可以由多个逻辑子条件组合而成,进行条件判决时,MATLAB将尽可能地减少判断子条件的次数。例如,判决条件为子条件1&子条件2, MATLAB检测到子条件1为假时,则认为判决条件为假,而不再检测子条件2的真假。

例4-5, if-else-end分支结构(形式1)的简单运用示例。

在命令行窗口输入:

    t=1:5
    if 1                %这里判断条件恒为真
    t1=6-t
    end

输出结果如下:

    t =      1      2      3      4      5
    t1 =     5      4      3      2      1

例4-6, if-else-end分支结构(形式3)的简单运用示例。

在命令行窗口输入:

    t=1:5
    if 0                %这里判断条件恒为假
    t1=6-t
    else
    t1=t-2
    end

输出结果如下:

    t =      1      2      3      4      5
    t1 =     -1      0      1      2      3

例4-7, if-else-end分支结构(形式3)的简单运用示例。

在命令行窗口输入:

    t=1:5
    if 0                %这里判断条件恒为假
    t1=6-t
    elseif 0
    t1=t-2
    else
    t1=t
    end

输出结果如下:

    t =      1      2      3      4      5
    t1 =     1      2      3      4      5

2.switch-case结构

switch-case结构的执行基于变量或表达式值的语句组。switch-case结构的具体句法结构如下:

    switch value          %value为需要进行判决的标量或字符串
        case test1
            command1      %如果value等于test1,执行commands1
        case test2
            command2      %如果value等于test2,执行commands1
    …
        case testk
            commandk      %如果value等于testk,执行commandsk
    otherwise
            commands      %如果value不等于前面所有值,执行commands
    end

说明:

● switch-case结构至少有一组命令组将被执行;

● switch后的表达式value应为一个标量或一个字符串,当表达式为标量时,比较形式为:表达式==检测值i;当表达式为字符串时,MATLAB将调用字符串函数strcmp来进行比较,比较形式为:strcmp(表达式,检测值i);

● case后的检测值不仅可以是一个标量值或一个字符串,还可以是一个元胞数组。如果检测室是一个元胞数组,则MATLAB将会把表达式的值与元胞数组中的所有元素进行比较;如果元胞数组中有某个元素与表达式的值相等,则MATLAB认为此次比较的结果为真,从而执行该次检测相对应的命令组。

例4-8, switch-case结构示例。

在命令行窗口输入:

    num = 3;
    switch num
        case 1
          data = ’差’
        case 2
          data = ’次’
        case 3
          data = ’中’
      case 4
          data = ’良’
      case 5
          data = ’优’
    otherwise
          data = ’请确认输入’
    end

输出结果如下:

    data =中

3.try-catch结构

try-catch结构的具体句法形式如下:

    try
        command1 %命令组commands1总是首先被执行。若正确,执行完成此命令组
    catch
        command2 %命令组commands1执行发生错误时,执行命令组commands2
    end

说明:

● 只有当命令组commands1发生错误时,才执行命令组commands2。

● try-catch结构只提供两个可供选择的命令组。

● 当执行commands1发生错误时,可调用lasterr函数查询出错的原因。如果函数lasterr的运行结果为空字符串,则表示命令组commands1被成功执行了。

● 如果执行命令组commands2又发生错误,则MATLAB将会终止该结构。

例4-9, try-catch结构示例。

在命令行窗口输入:

    n = 16;
    mat = magic(3)             %生成3阶魔法矩阵
    try
        mat_num = mat(n)       %取mat的第n个元素
    catch
    mat_end = mat(end)         %若mat没有第n个元素,则取mat的最后一个元素
    reason=lasterr             %显示出错原因
    end

输出结果如下:

    mat =     8      1      6
            3      5      7
        4      9      2
    mat_end =      2
    reason =Attempted to access mat(16); index out of bounds because numel(mat)=9.

提示

try-catch结构在程序调试场合非常有用。

4.三种分支结构比较

三种分支结构的比较如表4.2所示。

表4.2 三种分支结构的比较

4.2.3 循环结构

MATLAB中可用的循环结构有两种,分别为for循环结构和while循环结构。

1.for循环结构

for循环重复执行一组语句的一个预先给定的次数,其一般调用方式如下:

    for  x=array
        commands
    end

说明:

● for命令后面的变量x称为循环变量,而for与end之间的组命令commands为循环体。循环体被重复执行的次数由array数组的列数决定:在for循环过程中,循环变量x被依次赋值为数组array的各列,每赋值一次,循环体被执行一次。

● for循环内部语句末尾一般设置分号抑制输出,而在循环后可以在命令行窗口输入相关语句来显示最终结果。

例4-10,通过for循环创建对称矩阵。

在命令行窗口中输入:

    for i = 1:4
        for j = 1:4
          if i>=j
                mat(i, j)=i^2;
          else
              mat(i, j) =j^2; ;
          end
        end
    end
    mat

输出结果如下:

    mat =   1      4      9     16
            4      4      9     16
            9      9      9     16
            16     16     16    16

例4-11,求解1+3+…+1001的和。

在命令行窗口中输入:

    sum = 0;
    for i = 1:2:1001
        sum = sum + i;
    end
    sum

输出结果如下:

    sum =     251001

2.while循环结构

while循环在逻辑条件的控制下重复一组语句一个不定的次数,直到该条件为假,其具体的句法结构如下:

    while expression
        commands
    end

说明:

● 命令组commands被称为循环体。在运行while循环前,首先检测expression的值,若其逻辑值为真,则执行命令组commands;命令组第一次执行完毕后,继续检测expression的逻辑值,若其逻辑值为真,则循环执行命令组commands,直到表达式expression的逻辑值为假时,结束while循环。

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

● 表达式的值一般是标量值,但也可为数组;当表达式为数组时,当且仅当数组所有元素的逻辑值均为真时,while循环才继续执行命令组。

● 如果while命令后的表达式为空数组,那么MATLAB默认表达式的值为假,此时直接结束循环。

● 判决条件可以由多个逻辑子条件组合而成;进行条件判决时,MATLAB将尽可能地减少判断子条件的次数;例如,判决条件为(子条件1&子条件2), MATLAB检测到子条件1为假时,则认为判决条件为假,而不再检测子条件2的真假。

例4-12, while结构示例。

在命令行窗口输入:

    sum=0;
    i=0;
    while i <=100
    sum=sum+i;
        i = i + 2;
    end
    sum

运行M文件,结果如下:

    sum =      2550

3.for循环、while循环比较

for循环与while循环的区别在于for循环的循环次数是一定的,由(end-start)/initval决定;而while循环的循环次数是不确定的。

当用户无法确定循环次数但知道满足什么条件循环就会停止,这时使用while循环比较合理。

4.2.4 其他常用控制命令

MATLAB还提供了如下的命令用于控制程序的运行。

1.return命令

一般在函数被执行完成后,MATLAB才自动将控制权转回主函数或命令行窗口。但如果在函数中插入return命令,可以强制MATLAB结束该函数并把控制权转回主函数或命令行窗口。

2.input和keyboard命令

input命令将MATLAB的控制权暂时交给用户,等待用户通过键盘输入数值、字符串或表达式等并按下Enter键将输入内容传递到工作区后,收回控制权。

其常用的调用格式如下:

    value = input('message') %将用户输入的内容赋值给变量value
    value = input('message', 's')%将用户输入的内容以字符串的形式赋值给变量value

说明:

● 命令中的’message’是将显示在屏幕上的字符串;

● 对于第一种调用格式,可以输入数值、字符串等各种形式的数据;

● 对于第二种调用格式,无论输入什么内容,均以字符串的形式赋值给变量。

keyboard命令将控制权暂时交给键盘,用户可以由键盘输入各种合法的MATLAB命令,只有当用户输入完成,并输入return命令后,才收回控制权。

input命令和keyboard命令的不同之处在于:keyboard命令允许输入任意多个MATLAB命令,而input命令只允许用户输入赋值给变量的数组、字符串或元胞数组等。

3.pause命令

pause命令的功能为控制执行文件的暂停与恢复,其调用格式如下:

    pause         暂停执行文件,等待用户按任意键继续
    pause(n)      在继续执行文件之前,暂停n秒

4.continue命令

continue语句把控制权交给下一个for或while循环所嵌套的迭代。

5.break命令

在for循环或while循环结构中,有时并不需要运行到最后一次循环,而需要及时跳出循环。break命令可以满足这一功能,其可终止for循环或while循环结构。

6.error和warning命令

在编写M文件时,常用的错误或警告命令调用格式有以下几种:

    error('message')        %显示出错信息message,终止程序
    errortrap               %在错误发生后,控制程序继续执行与否的开关
    lasterr                 %终止程序并显示MATLAB系统判断的最新出错原因
    warning('message')      %显示警告信息message,继续运行程序
    lastwarn                %显示MATLAB系统给出的最新警告程序并继续运行

7.示例

例4-13, continue命令使用示例。

建立ex4_13a.m文件,内容如下:

    %sum of numbers
    sum=0;
    i=0;
    while i <=100
    sum=sum+i;
        i = i + 2;
    end
    sum

在命令行窗口中输入:

    fid = fopen('ex4_13a.m', 'r');
    count = 0;
    while ~feof(fid)
        line = fgetl(fid);
        if isempty(line) | strncmp(line, '%',1)
          continue
        end
        count = count + 1;
    end
    disp(sprintf('%d lines', count));

输出结果如下:

    7 lines

提示

ex4_13a.m共8行,其中有效计数的为7行。

例4-14, for循环的中途终止。

在命令行窗口中输入:

    sum=0;
    i=0;
    while i <=100
        sum=sum+i;
        i = i + 2;
        if i==100
        break
        end
    end
    sum

输出结果如下:

    sum =          2450

提示

可与例4-12进行比较。