16-程式流程控制_第1页
16-程式流程控制_第2页
16-程式流程控制_第3页
16-程式流程控制_第4页
16-程式流程控制_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MATLAB程式設計入門篇

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

>>disp(x)

11/21/31/41/51/63程式流程控制之範例二for迴圈可以是多層或巢狀式(Nested)的,在下例中即產生一個6×6的Hilbert矩陣h,其中為於第i列、第j行的元素為:範例16-2:forLoop02.m h=zeros(6); %變數x是一個6×6大小的零矩陣 fori=1:6 forj=1:6 h(i,j)=1/(i+j-1); end end formatrat %使用分數形式來顯式所有數值 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迴圈列出先前產生的Hilbert矩陣的每一直行的平方和:範例16-3:forLoop01.m formatshort %回到預設形式來顯式所有數值 fori=h disp(norm(i)^2); %印出每一行的平方和 End 1.4914 0.5118 0.2774 0.1787 0.1262 0.0944在上例中,由於h是一個矩陣,因此每一次i的值就是矩陣h的一直行的內容。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程式流程控制之範例五在一個迴圈內若要直接跳至到此迴圈下一回合的執行,可使用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)是負數,即可使用continue指令來直接跳到此迴圈的下一個回合來繼續執行。Continue指令從MATLAB6.x才開始支援,若是使用MATLAB5.x,可用if–then–else來達到相同的功能。7程式流程控制之範例六先前產生調和數列的例子,亦可用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的執行速度,因此盡量使用向量化的運算(VectorizedOperations)而盡量少用迴圈。break指令若用在多重迴圈中,每次只跳出包含break指令的最內部迴圈。916-2條件指令MATLAB支援二種條件指令(BranchingCommand,或中譯成「分支指令」),一種是if-then-else條件指令,另一種是MATLAB在第五版之後開始支援的switch-case-otherwise條件指令,以下分述之。最常用的條件指令是if-then-else,其使用語法為: if 條件式 運算式一; else

運算式二; end當條件式成立時,MATLAB將執行運算式一,否則,就執行運算式二。若不需使用運算式二,則可直接省略else和運算式二。10程式流程控制之範例八在數值運算的過程中,若變數值為NaN(即NotANumber)時,我們要立刻印出警告訊息,可輸入如下例:範例16-8:if01.m x=0/0; ifisnan(x) disp('Warning:NaNdetected!'); end Warning:Dividebyzero. … Warning:NaNdetected!在上例中,第一個警告訊息是MATLAB自動產生的,第二個警告訊息則是我們的程式碼產生的,其中isnan(x)可用於判斷x是否為NaN,若是,則傳回1(真),否則即傳回0(偽)。11程式流程控制之範例九在下例中,我們可根據向量y的元素值為奇數或偶數,來顯示不同的訊息:範例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為雙向條件,亦即程式只會執行「運算式一」或「運算式二」,不會有第三種可能。12程式流程控制之範例十MATLAB亦可執行多向條件,若要進行更多向的條件,只需一再重覆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為一數值或字串,當其值和value(k)相等時,MATLAB即執行statement(k)並跳出switch指令。若expression不等於value(k),k=1,2,…,n-1,則MATLAB會執行statement(n)並跳出switch指令。14程式流程控制之範例十一欲根據月份來判斷其季別,可輸入如下:範例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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论