16-程式流程控制_第1頁
16-程式流程控制_第2頁
16-程式流程控制_第3頁
16-程式流程控制_第4頁
16-程式流程控制_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

MATLAB程式設(shè)計入門篇

程式流程控制張智星清大資工系多媒體檢索實驗室116-1迴圈指令MATLAB提供兩種迴圈指令,一種是for迴圈(ForLoop),另一種是while迴圈(WhileLoop)。for迴圈的使用語法如下:for變數(shù)=向量, 運算式 end其中變數(shù)的值會被依次設(shè)定為向量的每一個元素值,來執(zhí)行介於for和end之間的運算式。另一種for迴圈的使用語法如下:for 變數(shù)=矩陣, 運算式 end此時變數(shù)的值會被依次設(shè)定為矩陣的每一個直行,來執(zhí)行介於for和end之間的運算式。while迴圈使用語法如下: while條件式 運算式; end2程式流程控制之範例一下列for迴圈會產(chǎn)生一個長度為6的調(diào)和數(shù)列(HarmonicSequence):範例16-1:forLoop01.m x=zeros(1,6); %變數(shù)x是一個1×6大小的零矩陣 fori=1:6 x(i)=1/i; end x %顯示x x= 1.00000.50000.33330.25000.20000.1667在上例中,矩陣x最初是一個1×6大小的零矩陣,在for迴圈中,變數(shù)i的值依次是1到6,因此矩陣x的第i個元素的值依次被設(shè)為1/i。我們接著可用分數(shù)形式來顯示此數(shù)列: >>formatrat %使用分數(shù)形式來顯式數(shù)值

>>disp(x)

11/21/31/41/51/63程式流程控制之範例二for迴圈可以是多層或巢狀式(Nested)的,在下例中即產(chǎn)生一個6×6的Hilbert矩陣h,其中為於第i列、第j行的元素為:範例16-2:forLoop02.m h=zeros(6); %變數(shù)x是一個6×6大小的零矩陣 fori=1:6 forj=1:6 h(i,j)=1/(i+j-1); end end formatrat %使用分數(shù)形式來顯式所有數(shù)值 h %顯示h h= 11/21/31/41/51/6 1/21/31/41/51/61/7 1/31/41/51/61/71/8 1/41/51/61/71/81/9 1/51/61/71/81/91/10 1/61/71/81/91/101/114程式流程控制之範例三在下例中,for迴圈列出先前產(chǎn)生的Hilbert矩陣的每一直行的平方和:範例16-3:forLoop01.m formatshort %回到預設(shè)形式來顯式所有數(shù)值 fori=h disp(norm(i)^2); %印出每一行的平方和 End 1.4914 0.5118 0.2774 0.1787 0.1262 0.0944在上例中,由於h是一個矩陣,因此每一次i的值就是矩陣h的一直行的內(nèi)容。5程式流程控制之範例四若要跳出for迴圈,可用break指令。例如,若要找出最小的n值,滿足n!>10100,可輸入如下:範例16-4:break01.m fori=1:1000 ifprod(1:i)>1e100 fprintf('%g!=%e>1e100\n',i,prod(1:i)); break; %跳出for迴圈

end end 70!=1.197857e+100>1e100

6程式流程控制之範例五在一個迴圈內(nèi)若要直接跳至到此迴圈下一回合的執(zhí)行,可使用continue指令。範例16-5:continue01.m x=[1-23-45]; posTotal=0; fori=1:length(x) ifx(i)<0,continue;end %若x(i)小於零,跳到此迴圈的下一回合

posTotal=posTotal+x(i); end posTotal %顯示posTotal的值 posTotal= 9上述範例中,我們計算向量x的正元素的總和,因此只要遇到x(i)是負數(shù),即可使用continue指令來直接跳到此迴圈的下一個回合來繼續(xù)執(zhí)行。Continue指令從MATLAB6.x才開始支援,若是使用MATLAB5.x,可用if–then–else來達到相同的功能。7程式流程控制之範例六先前產(chǎn)生調(diào)和數(shù)列的例子,亦可用while迴圈改寫如下:範例16-6:while01.m x=zeros(1,6); i=1; whilei<=6 x(i)=1/i; i=i+1; end x %顯示x x= 1.00000.50000.33330.25000.20000.16678程式流程控制之範例七若要用while指令找出最小的n值,使得n!>10100,可輸入如下:範例16-7:while02.m n=1; whileprod(1:n)<1e100 n=n+1 end fprintf('%g!=%e>1e100\n',n,prod(1:n)); 70!=1.197857e+100>1e100與前述的for迴圈相同,在任何時刻若要跳出while迴圈,亦可使用break指令;若要跳到下一回合的while迴圈,也可以使用continue指令。無論是for或while迴圈,均會降低MATLAB的執(zhí)行速度,因此盡量使用向量化的運算(VectorizedOperations)而盡量少用迴圈。break指令若用在多重迴圈中,每次只跳出包含break指令的最內(nèi)部迴圈。916-2條件指令MATLAB支援二種條件指令(BranchingCommand,或中譯成「分支指令」),一種是if-then-else條件指令,另一種是MATLAB在第五版之後開始支援的switch-case-otherwise條件指令,以下分述之。最常用的條件指令是if-then-else,其使用語法為: if 條件式 運算式一; else

運算式二; end當條件式成立時,MATLAB將執(zhí)行運算式一,否則,就執(zhí)行運算式二。若不需使用運算式二,則可直接省略else和運算式二。10程式流程控制之範例八在數(shù)值運算的過程中,若變數(shù)值為NaN(即NotANumber)時,我們要立刻印出警告訊息,可輸入如下例:範例16-8:if01.m x=0/0; ifisnan(x) disp('Warning:NaNdetected!'); end Warning:Dividebyzero. … Warning:NaNdetected!在上例中,第一個警告訊息是MATLAB自動產(chǎn)生的,第二個警告訊息則是我們的程式碼產(chǎn)生的,其中isnan(x)可用於判斷x是否為NaN,若是,則傳回1(真),否則即傳回0(偽)。11程式流程控制之範例九在下例中,我們可根據(jù)向量y的元素值為奇數(shù)或偶數(shù),來顯示不同的訊息:範例16-9:if02.m y=[03416]; fori=1:length(y) ifrem(y(i),2)==0 fprintf('y(%g)=%giseven.\n',i,y(i)); else fprintf('y(%g)=%gisodd.\n',i,y(i)); end end y(1)=0iseven. y(2)=3isodd. y(3)=4iseven. y(4)=1isodd. y(5)=6iseven.上述的if-then-else為雙向條件,亦即程式只會執(zhí)行「運算式一」或「運算式二」,不會有第三種可能。12程式流程控制之範例十MATLAB亦可執(zhí)行多向條件,若要進行更多向的條件,只需一再重覆elseif即可。例如,欲判斷y向量之元素是屬於3n、3n+1、或3n+2,可輸入如下:範例16-10:if03.m y=[34592]; fori=1:length(y) ifrem(y(i),3)==0 fprintf('y(%g)=%gis3n.\n',i,y(i)); elseifrem(y(i),3)==1 fprintf('y(%g)=%gis3n+1.\n',i,y(i)); else fprintf('y(%g)=%gis3n+2.\n',i,y(i)); end end y(1)=3is3n. y(2)=4is3n+1. y(3)=5is3n+2. y(4)=9is3n. y(5)=2is3n+2.13switch-case-otherwise指令MATLAB在第五版開始支援switch-case-otherwise的多向條件指令,其使用語法如下: switchexpression casevalue(1) statement(1) casevalue(2) statement(2) casevalue(n-1) statement(n-1) otherwise statement(n) end在上述語法中,expression為一數(shù)值或字串,當其值和value(k)相等時,MATLAB即執(zhí)行statement(k)並跳出switch指令。若expression不等於value(k),k=1,2,…,n-1,則MATLAB會執(zhí)行statement(n)並跳出switch指令。14程式流程控制之範例十一欲根據(jù)月份來判斷其季別,可輸入如下:範例16-11:switch01.m formonth=1:12 switchmonth case{3,4,5} season='Spring'; case{6,7,8} season='Summer'; case{9,10,11} season='Autumn'; case{12,1,2} season='Winter'; end fprintf('Month%d===>%s.\n',month,season); end Month1===>Winter. . . . . . . Month12===>Winter.15程式流程控制之範例十二 如果expression是字串,那麼若要在case之後比對多個字串,就必需使用字串的異值陣列(CellArreyofStrings):範例16-12:switch02.m month={'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep'}; fori=1:length(month) switc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論