MATLAB App Designer从入门到实践
上QQ阅读APP看书,第一时间看更新

MATLAB的基本程序结构为顺序结构,代码一行一行执行,但是,要完成一个稍微复杂的程序就需要循环及条件语句。MATLAB语言的顺序结构语句关键字见表1-1,循环的终止和控制权的移交关键字见表1-2。

表1-1 顺序结构语句关键字

表1-2 循环的终止和控制权的移交关键字

条件语句可用于在运行时选择要执行的代码块。最简单的条件语句为if语句。例如:

% 产生一个随机数
a = randi(100, 1)
% 如果是偶数,除以2
if rem(a, 2) == 0
    disp('a是个偶数')
    b = a/2;
end

通过使用可选关键字elseif或else,if语句可以包含备用选项。例如:

a = randi(100, 1)
if a < 30
    disp('small')
elseif a < 80
    disp('medium')
else
    disp('large')
end

再者,当希望针对一组已知值测试相等性时,可使用switch语句。例如:

[dayNum, dayString] = weekday(date, 'long', 'local')
switch dayString
    case 'Monday'
        disp('Start of the work week')
    case 'Tuesday'
        disp('Day 2')
    case 'Wednesday'
        disp('Day 3')
    case 'Thursday'
        disp('Day 4')
    case 'Friday'
        disp('Last day of the work week')
    otherwise
        disp('Weekend!')
end
1.2.1.1 if, elseif, else语句

if, elseif, else语句,条件为true时执行代码。

1.语法

if expression
    statements
elseif expression
    statements
else
    statements
end

2.说明

if expression, statements, end计算表达式,并在表达式为true时执行一组语句。当表达式的结果非空并且仅包含非零元素(逻辑值或实数值)时,该表达式为true;否则,表达式为false。

elseif和else模块是可选的。这些语句仅在if...end块中前面的表达式的结果为false时才会执行。if块可以包含多个elseif块。

3.详细信息

表达式可以包含关系运算符(如<或==)和逻辑运算符(如&&、||或~)。可使用逻辑运算符and和or创建复合表达式。MATLAB按照运算符优先级规则从左至右计算复合表达式。

在if...end块的条件表达式内,逻辑运算符&和 | 的行为与短路运算符的行为相同。它们分别相当于&&和 ||。由于&&和 || 在条件表达式和语句中一致短路,因此,建议在表达式中使用&&和 ||,而不是&和 |。例如:

x = 42;
if (5>6) && (myfunction(x) >= pi)
    disp('Expressions are true')
end

表达式的第一部分的计算结果为false。因此,MATLAB不需要计算表达式的第二部分,否则会导致未定义的函数错误。

4.提示

(1)可以嵌套任意数量的if语句。每个if语句需要一个end关键字。

(2)elseif的“else”和“if”之间不应有空格,否则会创建嵌套的if语句,该语句需要搭配独立的end关键字。

要确定运行时所执行的代码块,除if语句外还可以使用switch条件语句。

5.示例

(1)使用if、elseif和else指定条件。

最简单的条件语句为if…end语句。例如:

% 产生随机数
a = randi(100, 1);
% 如果是偶数就取半
if rem(a, 2) == 0
    disp('a is even')
    b = a/2;
end

通过使用可选关键字elseif或else,if语句可以包含备用选项。例如:

a = randi(100, 1);
if a < 30
    disp('small')
elseif a < 80
    disp('medium')
else
    disp('large')
end

(2)比较数组。

数组进行关系运算时,表达式(例如A>0)仅在结果中的每个元素都大于零时才为true。

下面的示例使用any函数测试是否有任意结果为true。

limit = 0.75;
A = rand(10,1)%产生10行1列的随机数
A = 10×1
    0.8147
    0.9058
    0.1270
    0.9134
    0.6324
    0.0975
    0.2785
    0.5469
    0.9575
    0.9649
if any(A > limit)
    disp('至少有一个值超出0.75。')
else
    disp('所有值都小于0.75。')
end

输出结果为:

至少有一个值超出0.75。

(3)测试数组的相等性。

使用isequal而不是==运算符比较数组来测试相等性,因为当数组的大小不同时,==会导致错误。

下面给出了比较两个数组的示例。

A = ones(2,3);%生成2行3列的1矩阵

B = rand(3,2);%生成一个由介于0和1之间的均匀分布的随机数组成的3行2列的数字矩阵

如果size(A)与size(B)相同,则会串联这两个数组,否则显示一条警告并返回一个空数组。

if isequal(size(A),size(B))
   C = [A; B];
else
   disp('数组A和B的大小不同。')
   C = [];
end

输出结果为:数组A和B的大小不同。

(4)比较字符向量。

MATLAB内部使用strcmp比较字符向量。当字符向量的大小不同时,使用==测试相等性会产生错误。

a='MAT';
b='LAB';
if (a==b)
    disp('字符a和b相同。')
else
    disp('字符a和b不相同。')
end

输出结果为:字符a和b不相同。

(5)评估表达式中的多个条件。

确定值是否在指定范围内。

x = 10;
minVal = 2;
maxVal = 6;
if (x >= minVal) && (x <= maxVal)
    disp('x的值介于2和6之间。')
elseif (x > maxVal)
    disp('x的值大于6。')
else
    disp('x的值小于2。')
end

输出结果为:

x的值大于6。

1.2.1.2 switch, case, otherwise语句

switch, case, otherwise语句用于执行多组语句中的一组。

1.语法

switch switch_expression
    case case_expression
        statements
    case case_expression
        statements
        ...
    otherwise
    statements
end

2.说明

switch switch_expression, case case_expression, end计算表达式,并选择执行多组语句中的一组。每个选项为一个case。

switch块会测试每个case,直至一个case表达式为true。case在以下情况下为true。

(1)对于数字,case_expression == switch_expression。

(2)对于字符向量,strcmp(case_expression,switch_expression) == 1。

(3)对于支持eq函数的对象,case_expression==switch_expression,重载的eq函数的输出必须为逻辑值或可转换为逻辑值。

(4)对于元胞数组case_expression,元胞数组的至少一个元素与switch_expression匹配,如上述对数字、字符向量和对象的定义。

当case表达式为true时,MATLAB执行对应的语句,然后退出switch块。

这里的switch_expression必须为标量或字符向量。case_expression必须为标量、字符向量或标量,或者字符向量元胞数组。

otherwise块是可选的。仅当没有case为true时,MATLAB才会执行这些语句。

3.提示

(1)case_expression不能包含关系运算符(例如“或”运算符)来与switch_expression进行比较。要测试不相等性,可使用if, elseif ,else语句。

(2)MATLAB的switch语句不会像C语言的switch语句一样失效。如果第一个case语句为true,则MATLAB不会执行其他case语句。例如:

result = 52;
switch(result)
    case 52
        disp('result is 52')
    case {52, 78}
        disp('result is 52 or 78')
end
result is 52

(3)在该case内定义特定case中的代码所需要的变量。由于MATLAB仅执行任何switch语句的一个case,因此一个case内定义的变量不适用于其他case。例如,如果当前工作区不包含变量x,则仅定义x的情况可以使用以下方法。

switch choice
    case 1
        x = -pi:0.01:pi;
    case 2
        % does not know anything about x
end

(4)MATLAB的break语句会结束for或while循环的执行,但不结束switch语句的执行。此行为不同于C语言中break和switch的行为。

(5)对于if和switch,MATLAB执行与第一个表达式结果为true的条件相应的代码,然后退出该代码块。每个条件语句都需要end关键字。

一般而言,如果具有多个可能的离散已知值,读取switch语句比读取if语句更容易。但是,无法测试switch和case值之间的不相等性。例如,无法使用switch实现以下类型的条件。

yourNumber = input('Enter a number: ');
if yourNumber < 0
    disp('Negative')
elseif yourNumber > 0
    disp('Positive')
else
    disp('Zero')
end

4.示例

(1)比较单个值。

根据在命令提示符下输入的值,有条件地显示不同的文本。

n = input('Enter a number: ');
switch n
    case -1
        disp('negative one')
    case 0
        disp('zero')
    case 1
        disp('positive one')
    otherwise
        disp('other value')
end

在命令提示符下,输入数字1,返回结果“positive one”。

重复执行该代码并输入数字3,返回结果“other value”。

(2)与多个值进行比较。

根据输入的月份判断季节,如果输入3、4、5中的任何一个值,则显示春季,其他季节类似。创建包含3个值的元胞数组。

month=3;
switch month
    case {3,4,5}
        season='春季'
    case {6,7,8}
        season='夏季'
    case {9,10,11}
        season='秋季'
    otherwise
        season='冬季'        
end

通过循环控制语句,可以重复执行代码块。循环有两种类型。

(1)for语句。循环特定次数,并通过递增的索引变量跟踪每次迭代。

例如,预分配一个2元素向量并计算5个值。

x = ones(1,2)
for n = 1:4
    x(n+1) = 2 * x(n)
end

(2)while语句。只要条件仍然为true就进行循环。

例如,计算5的阶乘。

a=5;
n=1;
nFactorial = 1;
while n <= a
    nFactorial = nFactorial * n
    n = n + 1;
end
1.2.2.1 for语句

用来重复指定次数的for循环。

1.语法

for index = values
    statements
end

2.说明

在循环中将一组语句执行特定次数。values为下列形式之一。

(1)initVal:endVal。index从initVal至endVal按1递增,重复执行statements,直到index大于endVal。

(2)initVal:step:endVal。每次迭代时,index按值step递增,或在step是负数时递减。

(3)valArray。每次迭代时从数组valArray的后续列创建列向量index。例如,在第一次迭代时,index=valArray(:,1)。循环最多执行n次,其中n是valArray的列数,由numel(valArray (1,:))给定。输入的valArray可属于任何MATLAB数据类型,包括字符向量、元胞数组或结构体。

3.提示

(1)要以编程方式退出循环,可使用break语句。要跳过循环中的其余指令,并开始下一次迭代,可使用continue语句。

(2)避免在循环语句内对index变量赋值。for语句会覆盖循环中对index所做的任何更改。

(3)要对单列向量的值进行迭代,应首先将其转置,以创建一个行向量。

(4)每个循环都需要end关键字。

(5)最好对循环进行缩进处理,以便于阅读,特别是使用嵌套循环时(即一个循环包含另一个循环)。

A = zeros(5,100);
for m = 1:5
    for n = 1:100
        A(m, n) = 1/(m + n - 1);
    end
end

可以通过选中所有代码,使用实时编辑器的智能功能一键设置缩进,见图1-9。

图片 467

图1-9 智能缩进语句

实时编辑器的基本用法和M文件用法一致。

(6)如果意外创建了一个无限循环(永远不会自行结束的循环),可按“Ctrl+C”组合键停止执行循环。

4.示例

(1)计算数值。

a=10;
for b = 1
    a+b
end

(2)步长递增或者递减值。

以0.7为步长递增,计算正弦函数的值。

a= 10;
for b = 1:0.7:a
    d=sin(b);
end

以0.7为步长递减,计算正弦函数的值。

a= 10;
for b = a:-0.7:1
    c=sin(b);
end

(3)执行指定值的语句。

for v = [1 5 8 17]
    disp(v)
end
     1
     5
     8
     17

(4)对每个矩阵列重复执行语句。

for I = eye(4,3)
    disp('Current unit vector:')
    disp(I)
end
Current unit vector:
     1
     0
     0
     0
Current unit vector:
     0
     1
     0
     0
Current unit vector:
     0
     0
     1
     0
1.2.2.2 while语句

条件为true时重复执行的while循环。

1.语法

while expression
    statements
end

2.说明

while expression, statements,end计算一个表达式,并在该表达式为true时在一个循环中重复执行一组语句。表达式的结果非空并且仅包含非零元素(逻辑值或实数值)时,该表达式为true;否则,该表达式为false。

3.详细信息

表达式可以包含关系运算符(如<或==)和逻辑运算符(如&&、||或~)。使用逻辑运算符“和”和“或”创建复合表达式。MATLAB按照运算符优先级规则从左至右计算复合表达式。

在while...end块的条件表达式中,逻辑运算符&和 | 的行为方式和短路运算符一样,分别相当于&&和 || 的行为。由于&&和 || 在条件表达式和语句中一致短路,因此,建议在该表达式中使用&&和 ||,而不是&和 |。例如:

x = 5;
while (x<1) && (exp(x) >= pi)  
    disp('Expressions are true')
    break    
end

表达式的第一部分的计算结果为false。因此,MATLAB不需要计算表达式的第二部分,否则会导致未定义的函数错误。

4.提示

(1)如果意外创建了一个无限循环(即永远不会自行结束的循环),可按“Ctrl+C”组合键停止执行循环。

(2)如果条件表达式的计算结果是一个矩阵,则仅当该矩阵中的所有元素都为true(非零)时,MATLAB才会计算这些语句。要在任意元素为true时执行语句,可在any函数中为表达式换行。

(3)要以编程方式退出循环,可使用break语句。要跳过循环中的其余指令,并开始下一次迭代,可使用continue语句。

(4)嵌套许多while语句时,每个while语句都需要一个end关键字。

5.示例

(1)重复执行语句,直到表达式为false。

使用while循环计算10的阶乘factorial(10)。

n = 10;
f = n;
while n > 1
    n = n-1;
    f = f*n;
end
disp(['n! = ' num2str(f)])

输出结果:

n! = 3628800

(2)跳至下一迭代。

使用continue语句跳过小于等于15的值,执行16到20的循环,开始下一迭代。

a = 1;b=3.14;
while a < 20
    a = a + 1;
    if a <= 15
        continue;%当a小于等于15时候不执行
    end
    b=b+1;
    fprintf('value of a : %d\n', a);
    fprintf('value of b : %d\n', b);
end

输出结果为:

value of a : 16
value of b : 4.140000e+00
value of a : 17
value of b : 5.140000e+00
value of a : 18
value of b : 6.140000e+00
value of a : 19
value of b : 7.140000e+00
value of a : 20
value of b : 8.140000e+00

(3)在表达式为false之前退出循环。

求随机数序列之和,直到下一随机数大于上限为止。然后,使用break语句退出循环。

limit = 0.8;
s = 0;
while 1
    tmp = rand
    if tmp > limit
        break  %如果随机数rand大于0.8则不执行s = s + tmp语句
    end
    s = s + tmp
end

continue可以将控制权传递给for或while循环的下一迭代。

1.语法

continue

2.说明

continue将控制权传递到for或while循环的下一迭代,它会跳过当前迭代的循环体中剩余的任何语句,程序继续从下一迭代执行。

continue仅在调用它的循环的主体中起作用。在嵌套循环中,continue仅跳过所在的循环体内的剩余语句。

3.提示

continue语句跳过当前for或while循环中剩余的语句,并开始下一迭代。要完全退出循环,可使用break语句。

要退出函数,请使用return语句。

4.示例

显示从1到50的整数中的7的倍数。如果数字不能被7整除,可使用continue跳过disp语句,并将控制权传递到for循环的下个迭代中。

for n = 1:50
    if mod(n,7)
        continue
    end
    disp(['Divisible by 7: ' num2str(n)])
end
Divisible by 7: 7
Divisible by 7: 14
Divisible by 7: 21
Divisible by 7: 28
Divisible by 7: 35
Divisible by 7: 42
Divisible by 7: 49

MATLAB的break可以终止执行for或while循环。

1.语法

break

2.说明

关键字break用于终止执行for或while循环。不执行循环中在break语句之后显示的语句。

在嵌套循环中,break仅退出它所在的循环,控制传递给该循环的end之后的语句。

3.提示

break语句完全退出for或while循环。要跳过循环中的其余指令,并开始下一次迭代,可使用continue语句。

break不是在for或while循环之外定义的。要退出函数,可使用return语句。

4.示例

求随机数序列之和,直到下一随机数大于上限为止。然后,使用break语句退出循环。

limit = 0.8;
s = 0;
while 1
    tmp = rand;
    if tmp > limit
        break
    end
    s = s + tmp
end

MATLAB的return可以将控制权交还给调用脚本或函数。

1.语法

return

2.说明

return强制MATLAB在到达调用脚本或函数的末尾前将控制权交还给调用程序。调用程序指的是调用包含return调用的脚本或函数的某脚本或函数。如果直接调用包含return的脚本或函数,则不存在调用程序,MATLAB将控制权交还给命令提示符。



注意

在条件块(例如if或switch)或循环控制语句(例如for或while)使用return时需要小心。当MATLAB到达return语句时,它并不仅会退出循环,还会退出脚本或函数,并将控制权交还给调用程序或命令提示符。



3.示例

(1)将控制权返回给键盘。

在当前工作文件夹中,创建函数findSqrRootIndex,以在数组中第一次出现给定值的平方根时,返回其索引值。如果未求出平方根,则该函数返回NaN。

function idx = findSqrRootIndex(target,arrayToSearch)
idx = NaN;
if target < 0
   return
end

for idx = 1:length(arrayToSearch)
    if arrayToSearch(idx) == sqrt(target)
        return
    end
end

在命令提示符下调用该函数。

A = [3 7 28 14 42 9 0];
b = 81;
findSqrRootIndex(b,A)
ans =     6

当MATLAB遇到return语句时,它将控制权交还给键盘,因为没有调用脚本或函数。

(2)将控制权返回给调用函数。

在当前工作文件夹下的文件returnControlExample.m中,创建以下函数,以在数组中第一次出现给定值的平方根时,返回其索引值。此函数调用在前一示例中创建的findSqrRootIndex函数。

function returnControlExample(target)
    arrayToSearch = [3 7 28 14 42 9 0];
    idx = findSqrRootIndex(target,arrayToSearch);

    if isnan(idx)
        disp('Square root not found.')
    else
        disp(['Square root found at index ' num2str(idx)])
    end
end

在命令提示符下调用该函数。

returnControlExample(49)
Square root found at index 2

当MATLAB在findSqrRootIndex中遇到return语句时,它将控制权返回给调用函数returnControlExample并显示相关消息。