《MATLAB图像处理375例》——1.8 MATLAB程序流程控制结构
本節(jié)書摘來自異步社區(qū)《MATLAB圖像處理375例》一書中的第1章,第1.8節(jié),作者:MATLAB技術(shù)聯(lián)盟著,更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“異步社區(qū)”公眾號(hào)查看
1.8 MATLAB程序流程控制結(jié)構(gòu)
MATLAB圖像處理375例
作為計(jì)算機(jī)語言,編程是必需的,編程靠的是程序控制語句。計(jì)算機(jī)語言程序控制模式主要有三大類:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。這一點(diǎn)MATLAB與其他編程語言完全一致。
1.8.1 順序結(jié)構(gòu)
順序結(jié)構(gòu)是指所有組成程序源代碼的語句按照由上至下的次序依次執(zhí)行,直到程序的最后一個(gè)語句。這種程序的優(yōu)點(diǎn)是容易編制;缺點(diǎn)是結(jié)構(gòu)單一,能夠?qū)崿F(xiàn)的功能有限。
在MATLAB語言的函數(shù)中,變量主要有輸入變量、輸出變量及函數(shù)內(nèi)所使用的變量。
(1)數(shù)據(jù)輸入。
從鍵盤輸入數(shù)據(jù),可以使用input函數(shù)來進(jìn)行,該函數(shù)的調(diào)用格式為:
A=input(提示信息,選項(xiàng));其中提示信息為一個(gè)字符串,用于提示用戶輸入什么樣的數(shù)據(jù)。
如果在input函數(shù)調(diào)用時(shí)采用's'選項(xiàng),則允許用戶輸入一個(gè)字符串。例如,想輸入一個(gè)人的姓名,可采用命令:
xm=input('hello world','s');(2)數(shù)據(jù)輸出。
MATLAB提供的命令窗口輸出函數(shù)主要有disp函數(shù),其調(diào)用格式為:
disp(輸出項(xiàng))其中輸出項(xiàng)既可以為字符串,也可以為矩陣。
【例1-64】數(shù)據(jù)輸出示例。
A='MATLAB'; disp(A)運(yùn)行結(jié)果如下:
MATLAB【例1-65】輸入x,y的值,并將它們的值互換后輸出。
x=input('Input x.'); y=input('Input y.'); z=x; x=y; y=z; disp(x); disp(y);運(yùn)行結(jié)果如下:
Input x.1 Input y.221【例1-66】對(duì)任一自然數(shù)n,按如下法則進(jìn)行運(yùn)算:若n為偶數(shù),則將n除2;若n為奇數(shù),則將n乘2加1。將運(yùn)算結(jié)果按上面法則繼續(xù)運(yùn)算,重復(fù)若干次后計(jì)算結(jié)果最終是1。
n=input('input n='); %輸入數(shù)據(jù) while n~=1 r=rem(n,2); %求n/2的余數(shù)if r ==0n=n/2 %第一種操作elsen=2*n+1 %第二種操作end end運(yùn)行結(jié)果如下:
input n=5 n =32 n =16 n =8 n =4 n =2 n =1(3)程序的暫停。
暫停程序的執(zhí)行可以使用pause函數(shù),其調(diào)用格式為:
pause(延遲秒數(shù))如果省略延遲時(shí)間,直接使用pause,則將暫停程序,直到用戶按任一鍵后程序繼續(xù)執(zhí)行。若要強(qiáng)行中止程序的運(yùn)行,則可使用Ctrl+C命令。
1.8.2 選擇結(jié)構(gòu)
在MATLAB中,選擇結(jié)構(gòu)依照不同的判斷條件進(jìn)行判斷,然后根據(jù)判斷的結(jié)果選擇某一種方法來解決某一個(gè)問題。
在MATLAB中,if語句有3種格式。
(1)單分支if語句。
if 條件語句組end當(dāng)條件成立時(shí),則執(zhí)行語句組,執(zhí)行完之后繼續(xù)執(zhí)行if語句的后繼語句,若條件不成立,則直接執(zhí)行if語句的后繼語句。
(2)條件判斷語句也是程序設(shè)計(jì)語言中流程控制語句之一。使用該語句,可以選擇執(zhí)行指定的命令,MATLAB語言中的條件判斷語句是if-else-end語句。
雙分支if語句:
if 條件語句組1else語句組2end當(dāng)條件成立時(shí),執(zhí)行語句組1,否則執(zhí)行語句組2,語句組1或語句組2執(zhí)行后,再執(zhí)行if語句的后繼語句。
在程序設(shè)計(jì)中,也經(jīng)常碰到需要進(jìn)行多重邏輯選擇的問題,這時(shí)可以采用if-else-end語句的嵌套形式:
if〈邏輯判斷語句1〉邏輯值1為“真”時(shí)的執(zhí)行語句 elseif〈邏輯判斷語句2〉邏輯值2為“真”時(shí)的執(zhí)行語句 elseif〈邏輯判斷語句3〉 …… else當(dāng)以上所有的邏輯值均為假時(shí)的執(zhí)行語句
end
(3)多分支if語句。
用于實(shí)現(xiàn)多分支選擇結(jié)構(gòu)。
(4)if-else-end語句所對(duì)應(yīng)的是多重判斷選擇,而有時(shí)也會(huì)遇到多分支判斷選擇的問題。MATLAB語言為解決多分支判斷選擇提供了switch-case語句。
switch語句根據(jù)表達(dá)式的取值不同,分別執(zhí)行不同的語句,其語句格式為:
switch 表達(dá)式case 表達(dá)式1語句組1case 表達(dá)式2語句組2……case 表達(dá)式m語句組motherwise語句組nend與其他的程序設(shè)計(jì)語言的switch-case語句不同的是,在MATLAB語言中,當(dāng)其中一個(gè)case語句后的條件為真時(shí),switch-case語句不對(duì)其后的case語句進(jìn)行判斷,也就是說在MATLAB語言中,即使有多條case判斷語句為真,也只執(zhí)行所遇到的第一條為真的語句。這樣就不必像C語言那樣,在每條case語句后加上break語句以防止繼續(xù)執(zhí)行后面為真的case條件語句。
【例1-67】計(jì)算分段函數(shù)的值。
程序如下:
x=input('請(qǐng)輸入x的值:'); if x<=0y= (x+sqrt(pi))/exp(2) elsey=sin(x+sqrt(1+x*x))/2 end運(yùn)行結(jié)果如下:
請(qǐng)輸入x的值:1 y =0.3325【例1-68】輸入三角形的三條邊,求面積。
程序如下:
A=input('請(qǐng)輸入三角形的三條邊:');if A(1)+A(2)>A(3) & A(1)+A(3)>A(2) & A(2)+A(3)>A(1)p=(A(1)+A(2)+A(3))/2;s=sqrt(p*(p-A(1))*(p-A(2))*(p-A(3)));disp(s);elsedisp('不能構(gòu)成一個(gè)三角形。')end運(yùn)行結(jié)果如下:
請(qǐng)輸入三角形的三條邊:[6 8 10]24 請(qǐng)輸入三角形的三條邊:[1 1 2]不能構(gòu)成一個(gè)三角形。
【例1-69】輸入一個(gè)字符,若為大寫字母,則輸出其后繼字符,若為小寫字母,則輸出其前導(dǎo)字符,若為其他字符則原樣輸出。
程序如下:
E=input('','s');If E>='A' & E<='Z'disp(setstr(abs(E)+1));elseif E>='a'& E<='z'disp(setstr(abs(E)-1));elsedisp(c);end運(yùn)行結(jié)果如下:
A B b a a ` * *【例1-70】switch語句示例。
程序如下:
a=input('a=?'); switch a case 1 disp('a=1');case {2,3,4} disp('a=2or3or4');case 5disp('a=5');otherwise disp('other value'); end;運(yùn)行結(jié)果如下:
a=?3 a=2or3or4 a=?6 other value1.8.3 循環(huán)結(jié)構(gòu)
在MATLAB中,循環(huán)結(jié)構(gòu)就是在程序中某一條語句或多條語句重復(fù)多次的運(yùn)行。
在MATLAB中,包含兩種循環(huán)結(jié)構(gòu):循環(huán)次數(shù)不確定的while循環(huán),循環(huán)次數(shù)確定的for循環(huán)。這兩種不完全相同,各有特色。
(1)for循環(huán)結(jié)構(gòu)。
for循環(huán)語句是流程控制語句中的基礎(chǔ),使用該循環(huán)語句可以以指定的次數(shù)重復(fù)執(zhí)行循環(huán)體內(nèi)的語句,其格式為:
for 循環(huán)變量=表達(dá)式1:表達(dá)式2:表達(dá)式3
循環(huán)體語句
end
其中,表達(dá)式1的值為循環(huán)變量的初值,表達(dá)式2的值為步長(zhǎng),表達(dá)式3的值為循環(huán)變量的終值。步長(zhǎng)為1時(shí),表達(dá)式2可以省略。
(2)while循環(huán)結(jié)構(gòu)。
while語句可以實(shí)現(xiàn)“當(dāng)”型的循環(huán)結(jié)構(gòu),格式為:
while(表達(dá)式)MATLAB語句end其中,循環(huán)判斷語句為某種形式的邏輯判斷表達(dá)式,當(dāng)該表達(dá)式的值為真時(shí),就執(zhí)行循環(huán)體內(nèi)的語句;當(dāng)表達(dá)式的邏輯值為假時(shí),就退出當(dāng)前的循環(huán)體。
在while循環(huán)語句中,必須有可以修改循環(huán)控制變量的命令,否則該循環(huán)語言將陷入死循環(huán),除非循環(huán)語句中有控制退出循環(huán)的命令,如break語句、continue命令。當(dāng)程序流程運(yùn)行至該命令時(shí),不論循環(huán)控制變量是否滿足循環(huán)判斷語句均將退出當(dāng)前循環(huán),執(zhí)行循環(huán)后的其他語句。
【例1-71】水仙花數(shù)是指一個(gè)n位數(shù)(n≥3),它每個(gè)位上的數(shù)字的n次冪之和等于它本身。輸出全部水仙花數(shù)。
程序如下:
for m=100:999 m1=fix(m/100); %求m的百位數(shù)字 m2=rem(fix(m/10),10); %求m的十位數(shù)字 m3=rem(m,10); %求m的個(gè)位數(shù)字 if m==m1*m1*m1+m2*m2*m2+m3*m3*m3 disp(m) end end運(yùn)行結(jié)果如下:
153370371407【例1-72】輸入若干個(gè)數(shù),當(dāng)輸入0時(shí)結(jié)束輸入,求這些數(shù)的平均值和它們的和。
程序如下:
sum=0; n=0; val=input('請(qǐng)輸入數(shù)字 (輸入0結(jié)束):'); while (val~=0)sum=sum+val;n=n+1;val=input('請(qǐng)輸入數(shù)字 (輸入0結(jié)束):'); end if (n > 0)summean=sum/n end運(yùn)行結(jié)果如下:
請(qǐng)輸入數(shù)字 (輸入0結(jié)束):1 請(qǐng)輸入數(shù)字 (輸入0結(jié)束):2 請(qǐng)輸入數(shù)字 (輸入0結(jié)束):3 請(qǐng)輸入數(shù)字 (輸入0結(jié)束):4 請(qǐng)輸入數(shù)字 (輸入0結(jié)束):5 請(qǐng)輸入數(shù)字 (輸入0結(jié)束):0 sum =15 mean =31.8.4 程序流程控制語句及其他常用命令
1.break命令
在MATLAB中,break命令通常用于for或while循環(huán)語句中,與if語句一起使用,中止本次循環(huán),跳出最內(nèi)層循環(huán)。
【例1-73】break命令示例。
a=5;b=8; for i=1:4b=b+1;if i>2break %當(dāng)if條件滿足時(shí)不再執(zhí)行循環(huán)enda=a+2 end運(yùn)行結(jié)果如下:
a =7 a =92.continue命令
通常用于for或while循環(huán)語句中,與if語句一起使用,達(dá)到跳過本次循環(huán),去執(zhí)行下一輪循環(huán)的目的。
【例1-74】continue命令示例。
a=5;b=8; for i=1:4b=b+1;if i<2continue %當(dāng)if條件滿足時(shí)不再執(zhí)行后面語句enda=a+2 %當(dāng)i<2時(shí)不執(zhí)行該語句 end運(yùn)行結(jié)果如下:
a =7 a =9 a =113.try指令
try語句是MATLAB特有的語句,先試探性地執(zhí)行語句1,如果出錯(cuò),就將錯(cuò)誤信息存入系統(tǒng)保留變量lasterr中;然后再執(zhí)行語句2,如果不出錯(cuò),就轉(zhuǎn)向執(zhí)行end后面的語句。此語句可以提高程序的容錯(cuò)能力,增加編程的靈活性。該指令的一般結(jié)構(gòu)是:
【例1-75】已知某圖像文件,但不知其存儲(chǔ)格式為.bmp還是.jpg,試編程正確讀取該圖像文件。
trypicture=imread('tire.bmp','bmp');filename='tire.bmp'; catchpicture=imread('tire.tif','tif');filename='tire. tif '; end filename運(yùn)行結(jié)果如下:
filename filename = tire.bmp【例1-76】先求兩矩陣的乘積,若出錯(cuò),則自動(dòng)轉(zhuǎn)去求兩矩陣的點(diǎn)乘。
A=magic(2); B=[7,8;10,11]; tryC=A*B; catchC=A.*B; end C lasterr %顯示出錯(cuò)原因運(yùn)行結(jié)果如下:
C =37 4148 54 ans = SWITCH 表達(dá)式必須為標(biāo)量或字符串常量總結(jié)
以上是生活随笔為你收集整理的《MATLAB图像处理375例》——1.8 MATLAB程序流程控制结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《深入理解Hadoop(原书第2版)》—
- 下一篇: 《Python编程初学者指南》——1.2