![MATLAB R2020a完全自学一本通](https://wfqqreader-1252317822.image.myqcloud.com/cover/483/34667483/b_34667483.jpg)
4.3 MATLAB的控制流
MATLAB平台上的控制流结构包括顺序结构、if-else-end分支结构、switch-case结构、try-catch结构、for循环结构和while循环结构,这6种结构的算法及使用与其他计算机编程语言十分类似,有编程基础的读者可以很快掌握。
4.3.1 顺序结构
顺序结构是MATLAB程序中最基本的结构,表示程序中的各操作是按照它们出现的先后顺序执行的。顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算、输出三部曲的程序就是顺序结构。在大多数情况下,顺序结构作为程序的一部分,与其他结构一起构成一个复杂的程序,如分支结构中的复合语句、循环结构中的循环体等。
例4-2:计算圆的面积。该程序的语句顺序就是输入圆的半径r,计算S=π∙r∙r,输出圆的面积S。试着在MATLAB中编写求解圆面积的顺序结构的程序。
在MATLAB命令行窗口中运行指令edit,调出MATLAB的程序编辑器,系统即新建一个默认名为Untitled的M文件,在输入区输入下述代码(见图4-2):
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_19.jpg?sign=1739681534-uHCYOnQGiNCYXbpKw13Nl5lsRmUQrDnn-0-ed3b6dafd103e25596ebf4d8e1cb2af2)
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_20.jpg?sign=1739681534-gtvaZQjmYGTJg7ZcwKUt0skPh8vynLfR-0-1614f54c5154da86e787bdc7a59fc3f0)
图4-2 输入程序
单击“编辑器”选项卡→“文件”面板中的“保存”按钮,并以ex4_2为名称保存。
单击“运行”面板中的“运行”按钮运行该M文件,即可在命令行窗口中得到结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_23.jpg?sign=1739681534-xQM2Zl6c5fD3hFoo3ittnaAiRAdUMhSf-0-4503691f88154396c6aa9e63be12ff86)
4.3.2 if-else-end分支结构
if-else-end指令为程序流提供了一种分支结构,该结构的形式根据实际情况的不同而不同,主要有以下几种。
(1)若判决条件expression为真,则执行命令组,否则跳过该命令组。具体的调用格式如下:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_24.jpg?sign=1739681534-urap9izKaBPcXDmYXDmrwQQZNoW0K7TK-0-2bb92f7b100055ee9f97c2de78c9daa0)
(2)若可供选择的执行命令组有两组,则采用如下结构:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_25.jpg?sign=1739681534-9a6j7Gwr4X0sC4USZnLRBWMTaszsAC9Q-0-f6e813d3b557278de796316022baa7a1)
(3)若可供选择的执行命令组有n(n>2)组,则采用如下结构:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_26.jpg?sign=1739681534-vOXroKyfKDuaJItlTY6ezsaYVpqKUvcj-0-248db1e87650228150c745614ab656fb)
例4-3:if-else-end分支结构的简单运用示例。
创建M文件并命名为ex4_3.m,利用M文件编辑器在M文件中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_27.jpg?sign=1739681534-50nFHYzCfqUvSZxrF9hQLwwmFLeDvulP-0-8ded898e49bd3c557677d8d67367e449)
运行M文件,得到结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_28.jpg?sign=1739681534-ufA1dHbgyYXKJYvTgzWbtZpWc0pZHXXP-0-6c32e87380e65d57fb30307aa2419bb2)
例4-4:已知符号函数
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_29.jpg?sign=1739681534-H8PYBcwsHTQI0MHgvQm0O6UHVV87FcvU-0-60e12ed666b69de735f762d7722ede89)
使用if语句判断当给定变量x的值时,相应的函数值y。
创建M文件并命名为ex4_4.m,利用M文件编辑器在M文件中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_30.jpg?sign=1739681534-DptP93ZmsSgV7J8UaiNWT6fkupplxSC7-0-eca7458c1f63d5ac35848ac103214fa8)
调用该文件分别输入不同的x值(此处输入10),运行程序,得到结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_31.jpg?sign=1739681534-dB4TbJFpkEPLRjiP5jhtSvM3HFoHUGFn-0-17f719c53edf4a1659bbf19a46dc8789)
4.3.3 switch-case结构
switch语句执行基于变量或表达式值的语句组,关键字case和otherwise用于描述语句组。只执行第一个匹配的情形。用到switch则必须用end与之搭配。switch-case的具体语法结构如下:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_32.jpg?sign=1739681534-HYOkuP5iXqPUlKqJiKYvXKvcNHN7Xzah-0-3fe3073cda99b43489ae7e930b879a1a)
说明:
(1)switch-case结构的调用格式保证了至少有一组指令组将会被执行。
(2)switch指令之后的表达式value应为一个标量或一个字符串。当表达式为标量时,比较命令为表达式==检测值i;而当表达式为字符串时,MATLAB将会调用字符串函数strcmp来进行比较,即strcmp(表达式,检测值i)。
(3)case指令之后的检测值不仅可以是一个标量或一个字符串,还可以是一个元胞数组。如果检测时是一个元胞数组,则MATLAB将会把表达式的值与元胞数组中的所有元素进行比较。如果元胞数组中有某个元素与表达式的值相等,MATLAB则认为此次比较的结果为真,从而执行与该次检测相对应的命令组。
例4-5:switch-case结构的简单运用示例。
创建M文件并命名为ex4_5.m,利用M文件编辑器在M文件中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_33.jpg?sign=1739681534-FHKe0euxsBK4sBE5wfFYwyfHkMH7Enn7-0-d3ed784e3a5d09b02c6edf56b5109883)
运行M文件,得到结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_34.jpg?sign=1739681534-ta6x3PFtKFk25wnkBMSYoMNpwN6UKAoC-0-284a02d66586640bbadeff8a41140f4f)
例4-6:求任意底数的对数函数值。
打开Editor(M文件编辑器),编写程序如下:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_36.jpg?sign=1739681534-zj9lp8rEHZCtbI6C8j27SSwxEMIOZpZp-0-abf0a295386dabebeaee5076acfafc25)
将该脚本M文件命名为ex4_6.m。调用该文件,分别输入不同的n值和x值,运行程序,输出结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_37.jpg?sign=1739681534-KRTvjiYiYargtky9swJPrt1b8PDtXhPJ-0-632a0ec8d6213c2be14e7e10afc12fbe)
当n=1时,输入x值后,出现错误对话框,如图4-3所示。
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_38.jpg?sign=1739681534-pHMWjceK32V8n1koZm4WFSBrARFSetJg-0-c97cd74564aab2c6e91f10581020b8c3)
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_39.jpg?sign=1739681534-HE4dbemdZu1caPC90OzPxwh92ZLfVuie-0-6793831f7f721285decf0807fdab5bc3)
图4-3 错误对话框
○注意
与多分支的if语句相比,switch语句主要用于条件多且单一的情况,典型的应用情况是数学中的分段函数。此外,两者各有优缺点,如表4-4所示。
表4-4 if语句和switch语句的比较
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_40.jpg?sign=1739681534-KHo9XEqDae7cyrzArjhOikneaqeAyrwo-0-a36ee60489c9c2c8aebb52cf2b7fd506)
4.3.4 try-catch结构
try-catch结构的具体句法形式如下:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_41.jpg?sign=1739681534-1Nqdc4Qtj9OOAVACn3JDsTziZx2sUv8g-0-9f0a80cfa1b01d0c89d5b9fd4c51c3e5)
说明:
(1)只有当MATLAB执行命令组1发生错误时,才执行命令组2。try-catch结构只提供两个可供选择的命令组。
(2)当执行command1发生错误时,可调用lasterr函数查询出错的原因。如果函数lasterr的运行结果为空字符串,则表示命令组1被成功执行了。
(3)如果执行命令组2时又发生错误,则MATLAB将会终止该结构。
例4-7:try-catch结构的简单运用示例。
创建M文件并命名为ex4_7.m,利用M文件编辑器在M文件中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_42.jpg?sign=1739681534-twZI2IcoKm4OCstyIoL4rlaLUBBLN2YC-0-402c0331dba41d02b707af5880d730a1)
运行M文件,得到如下结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_43.jpg?sign=1739681534-NxSOuHpMZvxCbVVEwAkdzeATkvU05HDU-0-2e154acc1d19256a8fb9a8f5b6f0a2b9)
4.3.5 for循环结构
for循环结构是针对大型运算相当有效的运算方法。MATLAB中提供的循环结构有for循环结构和while循环结构两种。for循环重复执行一组语句预先给定的次数,匹配的end描述该语句。for循环结构的具体句法形式如下:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_44.jpg?sign=1739681534-p0ixBXRV45JEODa1GB1tP2UxDOP6arpI-0-4cef66b1d34cd0e4abba587f76662ace)
说明:
(1)for指令后面的变量x称为循环变量,而for与end之间的组命令commands被称为循环体。循环体被重复执行的次数是确定的,该次数由array数组的列数来确定。因此,在for循环过程中,循环变量x被依次赋值为数组array的各列,每次赋值,循环体都被执行一次。
(2)for循环内部语句末尾的分号隐藏重复的打印,若commands指令中包含变量,则循环后在命令行窗口中直接输入变量r来显示变量r经过循环后的最终结果。
例4-8:利用for循环创建对称矩形示例。
创建M文件并命名为ex4_8.m,利用M文件编辑器在M文件中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_45.jpg?sign=1739681534-jCy0p1EFrvVCrqkOlDTKZE88Lk2DqVaH-0-dc6b89a6e9f836ac5cbf1bb64efedf93)
运行M文件,得到如下结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_46.jpg?sign=1739681534-1WGTtqe9u9Q61ge8Fxp6jLbOjt13yFUL-0-dade3ff4b47199a4e35e9358897e6c72)
例4-9:利用for循环求解1+2+…+100的和,即。
创建M文件并命名为ex4_9.m,利用M文件编辑器在M文件中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_48.jpg?sign=1739681534-fPwBgIJtOHF7LZ8GC8zdwZMcNPw9SROF-0-170e3b66f15cb9c9b4332edf964643e6)
运行M文件,得到如下结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_49.jpg?sign=1739681534-968FUS5f7UWzwOgF2XAk36O7b4ZEIf6V-0-347033e4a53174c5da9756be3c6ccdad)
例4-10:利用for循环嵌套求解,
,
。
创建M文件并命名为ex4_10.m,利用M文件编辑器在M文件中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_53.jpg?sign=1739681534-A2pAm1smBTc6nYmWEFeINpa5e5IeLbZL-0-aaf71e5b586ef188fedb8122bb15810b)
运行后可得到如下结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_54.jpg?sign=1739681534-8FqHyvKUaVOTstBtgWL7inTeaspPd5r9-0-81e41bf247df23dc4e4d0bbe0ed68b5e)
4.3.6 while循环结构
while循环在一个逻辑条件的控制下重复执行一组语句不定的次数,匹配的end描述该语句。while循环结构的具体句法形式如下:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_55.jpg?sign=1739681534-Evcsl5rzQkzvXYe5lfhkO7WqbAo9VuD1-0-f9d0f37ea3afdaaeecf78b88d105625d)
说明:
(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文件中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_56.jpg?sign=1739681534-eZre0eYOfDltpZDKmHYFMbAbrb8AB4UX-0-23ad38c9175fbe827a9f373788c62c6f)
运行M文件,得到结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_57.jpg?sign=1739681534-1ehP8Bg2TZp4zdgFly6riu52KACFiS81-0-669dfb2d29aaf08e2241803e7733aa90)
例4-12:利用while循环求解表达式。
创建M文件并命名为ex4_12.m,利用M文件编辑器在M文件中输入:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_59.jpg?sign=1739681534-hSQ75X1EbHAajR8svRCFylubn4dPJtY3-0-1f4bf5eb9edc33416217cbf5e949e205)
运行后可得到如下结果:
![img](https://epubservercos.yuewen.com/C258E9/18519308401625406/epubprivate/OEBPS/Images/txt006_60.jpg?sign=1739681534-XkdM3t8sPoTX3xeYeeeWINgRk5BFI90L-0-4e1dc21af5a5fcb538d935971557c631)
for循环和while循环的对比:
for循环与while循环的区别在于for循环的循环次数是一定的,由(end-start)/initval决定;而while循环的循环次数是不确定的。
因此,在用户无法确定循环次数,或者根本不需要知道循环次数,而只需要确定满足什么条件循环不停止的情况下,使用while循环比较合理。