4.3 MATLAB的控制流(2)
MATLAB平台上的控制流结构包括顺序结构、if-else-end分支结构、switch-case结构、try-catch结构、for循环结构和while循环结构,这6种结构的算法及使用与其他计算机编程语言十分类似,有编程基础的读者可以很快掌握。
4.3.4 try-catch结构
try-catch结构的具体句法形式如下:
try command1 % 命令组1总是首先被执行。若正确,则执行完成后结束此结构 catch command2 % 当命令组1执行发生错误时,执行命令组2 end
说明:
(1)只有当MATLAB执行命令组1发生错误时,才执行命令组2。try-catch结构只提供两个可供选择的命令组。
(2)当执行command1发生错误时,可调用lasterr函数查询出错的原因。如果函数lasterr的运行结果为空字符串,则表示命令组1被成功执行了。
(3)如果执行命令组2时又发生错误,则MATLAB将会终止该结构。
例4-7:try-catch结构的简单运用示例。
创建M文件并命名为ex4_7.m,利用M文件编辑器在M文件中输入:
Num = 6; Mat = magic(4) try Mat_Num = Mat(Num,:) % 取Mat的第Num行元素 catch Mat_end = Mat(end,:) % 若Mat没有Num行元素,则取Mat的最后一行元素 end lasterr % 显示出错原因
运行M文件,得到如下结果:
Mat = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 Mat_end = 4 14 15 1 ans = '位置 1 处的索引超出数组边界(不能超出 4)。'
4.3.5 for循环结构
for循环结构是针对大型运算相当有效的运算方法。MATLAB中提供的循环结构有for循环结构和while循环结构两种。for循环重复执行一组语句预先给定的次数,匹配的end描述该语句。for循环结构的具体句法形式如下:
for x = array commands end
说明:
(1)for指令后面的变量x称为循环变量,而for与end之间的组命令commands被称为循环体。循环体被重复执行的次数是确定的,该次数由array数组的列数来确定。因此,在for循环过程中,循环变量x被依次赋值为数组array的各列,每次赋值,循环体都被执行一次。
(2)for循环内部语句末尾的分号隐藏重复的打印,若commands指令中包含变量,则循环后在命令行窗口中直接输入变量r来显示变量r经过循环后的最终结果。
例4-8:利用for循环创建对称矩形示例。
创建M文件并命名为ex4_8.m,利用M文件编辑器在M文件中输入:
for i = 1 : 4 for j = 1 : 4 if i > (5 - j) else Mat(i,j) = i + j - 1; end end end Mat
运行M文件,得到如下结果:
Mat = 1 2 3 4 2 3 4 8 3 4 6 12 4 14 15 1
例4-9:利用for循环求解1+2+…+100的和。
创建M文件并命名为ex4_9.m,利用M文件编辑器在M文件中输入:
sum = 0; for i = 1 : 1 : 100 sum = sum + i; end sum
运行M文件,得到如下结果:
sum = 5050
例4-10:利用for循环嵌套求解,,。
创建M文件并命名为ex4_10.m,利用M文件编辑器在M文件中输入:
x = []; for n = 1:1:10 for k = 1:1:4 x(n,k) = sin((n * k * pi) / 360 ); end end x
运行后可得到如下结果:
x = 0.0087 0.0175 0.0262 0.0349 0.0175 0.0349 0.0523 0.0698 0.0262 0.0523 0.0785 0.1045 0.0349 0.0698 0.1045 0.1392 0.0436 0.0872 0.1305 0.1736 0.0523 0.1045 0.1564 0.2079 0.0610 0.1219 0.1822 0.2419 0.0698 0.1392 0.2079 0.2756 0.0785 0.1564 0.2334 0.3090 0.0872 0.1736 0.2588 0.3420
4.3.6 while循环结构
while循环在一个逻辑条件的控制下重复执行一组语句不定的次数,匹配的end描述该语句。while循环结构的具体句法形式如下:
while expression commands end
说明:
(1)在while和end之间的命令组被称为循环体。MATLAB在运行while循环之前,首先检测expression的值,若其逻辑值为真,则执行命令组;命令组第一次执行完毕后,继续检测expression的逻辑值,若其逻辑值仍为真,则循环执行命令组,直到表达式expression的逻辑值为假时,结束while循环。
(2)while循环和for循环的区别在于,while循环结构的循环体被执行的次数是不确定的,而for循环中循环体被执行的次数是确定的。
(3)一般情况下,表达式的值都是标量值,但是在MATLAB中也同样运行表达式为数组的情况。当表达式为数组且数组所有元素的逻辑值均为真时,while循环才继续执行命令组。
(4)如果while指令后的表达式为空数组,那么MATLAB默认表达式的值为假,直接结束循环。
(5)在if-else-end分支结构中提到的有关变量比较的注意事项,对while循环也同样适用。
例4-11:while循环结构的简单运用示例。
Fibonacci数列的元素满足如下规则:ak+2=ak+ak+1 (k=1,2,…);而且a1=a2=1。现在要求出Fibonacci数列中第一个大于9999的元素。
创建M文件并命名为ex4_11.m,利用M文件编辑器在M文件中输入:
a(1) = 1; a(2) = 1; i = 2; while a(i) < 10000 a(i + 1) = a(i) + a(i - 1); i = i + 1; end [i a(i)]
运行M文件,得到结果:
ans = 21 10946
结果表明,Fibonacci数列中第21项10946是第一个大于9999的元素
例4-12:利用while循环求解表达式。
创建M文件并命名为ex4_12.m,利用M文件编辑器在M文件中输入:
i = 1; sum = 0; while i <= 100 sum = sum + i; i = i + 1; end sum
运行后可得到如下结果:
sum = 5050
for循环和while循环的对比:
for循环与while循环的区别在于for循环的循环次数是一定的,由(end-start)/initval决定;而while循环的循环次数是不确定的。
因此,在用户无法确定循环次数,或者根本不需要知道循环次数,而只需要确定满足什么条件循环不停止的情况下,使用while循环比较合理。