MATLAB 程式设计入门篇程式流程控制

上传人:c****d 文档编号:243009671 上传时间:2024-09-13 格式:PPT 页数:20 大小:63KB
返回 下载 相关 举报
MATLAB 程式设计入门篇程式流程控制_第1页
第1页 / 共20页
MATLAB 程式设计入门篇程式流程控制_第2页
第2页 / 共20页
MATLAB 程式设计入门篇程式流程控制_第3页
第3页 / 共20页
点击查看更多>>
资源描述
,按一下以編輯母片標題樣式,按一下以編輯母片,第二層,第三層,第四層,第五層,*,MATLAB,程式設計入門篇:程式流程控制,按一下以編輯母片標題樣式,按一下以編輯母片,第二層,第三層,第四層,第五層,*,MATLAB,程式設計入門篇程式流程控制,張智星,(Roger Jang),清大資工系 多媒體檢索實驗室,1,16-1,迴圈指令,MATLAB,提供兩種迴圈指令,for,迴圈(,For Loop,),while,迴圈(,While Loop,),2,Formats of For Loops,Format 1:,for,變數,=,向量,運算式,end,在上述語法中,變數的值會被依次設定為向量的每一個元素值,來執行介於,for,和,end,之間的運算式。,Format 2:,for,變數,=,矩陣,運算式,end,在上述語法中,變數的值會被依次設定為矩陣的每一個直行,來執行介於,for,和,end,之間的運算式。,3,程式流程控制之範例一,下列,for,迴圈會產生一個長度為,6,的調和數列(,Harmonic Sequence,):,範例,16-1 : forLoop01.m,x = zeros(1,6);%,變數,x,是一個,16,大小的零矩陣,for i = 1:6,x(i) = 1/i;,end,x%,顯示,x,x =,1.0000 0.5000 0.3333 0.2500 0.2000 0.1667,在上例中,矩陣,x,最初是一個,16,大小的零矩陣,在,for,迴圈中,變數,i,的值依次是,1,到,6,,因此矩陣,x,的第,i,個元素的值依次被設為,1/i,。,我們接著可用分數形式來顯示此數列:,format rat%,使用分數形式來顯式數值,disp(x),1 1/2 1/3 1/4 1/5 1/6,4,程式流程控制之範例二,for,迴圈可以是多層或巢狀式(,Nested,)的,在下例中即產生一個,66,的,Hilbert,矩陣,h,,其中為於第,i,列、第,j,行的元素為 :,範例,16-2 : forLoop02.m,h = zeros(6);%,變數,x,是一個,66,大小的零矩陣,for i = 1:6,for j = 1:6,h(i,j) = 1/(i+j-1);,end,end,format rat%,使用分數形式來顯式所有數值,h%,顯示,h,h =,1 1/2 1/3 1/4 1/5 1/6,1/2 1/3 1/4 1/5 1/6 1/7,1/3 1/4 1/5 1/6 1/7 1/8,1/4 1/5 1/6 1/7 1/8 1/9,1/5 1/6 1/7 1/8 1/9 1/10,1/6 1/7 1/8 1/9 1/10 1/11,5,程式流程控制之範例三,在下例中,,for,迴圈列出先前產生的,Hilbert,矩陣的每一直行的平方和:,範例,16-3 : forLoop01.m,format short%,回到預設形式來顯式所有數值,for i = h,disp(norm(i)2); %,印出每一行的平方和,End,1.4914,0.5118,0.2774,0.1787,0.1262,0.0944,在上例中,由於,h,是一個矩陣,,因此,每一次,i,的值就是矩陣,h,的一直行的內容。,6,程式流程控制之範例四,若要跳出,for,迴圈,可用,break,指令。例如,若要找出最小的,n,值,滿足,n! 1e100,,可輸入如下:,範例,16-4 : break01.m,for i = 1:1000,if prod(1:i) 1e100,fprintf(%g! = %e 1e100n, i, prod(1:i);,break;%,跳出,for,迴圈,end,end,70! = 1.197857e+100 1e100,7,程式流程控制之範例五,在一個迴圈內若要直接跳至到此迴圈下一回合的執行,可使用,continue,指令。,範例,16-5 : continue01.m,x = 1 -2 3 -4 5;,posTotal = 0;,for i = 1:length(x),if x(i)0, continue; end%,若,x(i),小於零,跳到此迴圈的下一回合,posTotal=posTotal+x(i);,end,posTotal%,顯示,posTotal,的值,posTotal =,9,上述範例中,我們計算向量,x,的正元素的總和,因此只要遇到,x(i),是負數,即可使用,continue,指令來直接跳到此迴圈的下一個回合來繼續執行。,Continue,指令從,MATLAB 6.x,才開始支援,若是使用,MATLAB 5.x,,可用,if,else,來達到相同的功能。,8,Format of While Loops,While loop,的格式如下:,while,條件式,運算式;,end,在上述語法中,只要條件式為真,運算式就會一再被執行,9,程式流程控制之範例六,先前產生調和數列的例子,亦可用,while,迴圈改寫如下:,範例,16-6 : while01.m,x = zeros(1,6);,i = 1;,while i 1e100,,可輸入如下:,範例,16-7 : while02.m,n = 1;,while prod(1:n) 1e100n, n, prod(1:n);,70! = 1.197857e+100 1e100,與前述的,for,迴圈相同,在任何時刻若要跳出,while,迴圈,亦可使用,break,指令;若要跳到下一回合的,while,迴圈,也可以使用,continue,指令。,無論是,for,或,while,迴圈,均會降低,MATLAB,的執行速度,因此盡量使用向量化的運算(,Vectorized Operations,)而盡量少用迴圈。,break,指令若用在多重迴圈中,每次只跳出包含,break,指令的最內部迴圈。,11,16-2,條件指令,MATLAB,支援二種條件指令(,Branching Command,,或中譯成分支指令),if-else,條件指令,switch-case-otherwise,條件指令(,MATLAB,在第五版之後開始支援),12,if-else,條件指令,最常用的條件指令是,if-else,,其使用語法為,if,條件式,運算式一,;,else,運算式二,;,end,在上述語法中,當條件式成立時,,MATLAB,將執行運算式一,否則,就執行運算式二。若不需使用運算式二,則可直接省略,else,和運算式二。,13,程式流程控制之範例八,在數值運算的過程中,若變數值為,NaN,(即,Not A Number,)時,我們要立刻印出警告訊息,可輸入如下例:,範例,16-8 : if01.m,x = 0/0;,if isnan(x),disp(Warning: NaN detected!);,end,Warning: Divide by zero.,Warning: NaN detected!,在上例中,第一個警告訊息是,MATLAB,自動產生的,第二個警告訊息則是我們的程式碼產生的,其中,isnan(x),可用於判斷,x,是否為,NaN,,若是,則傳回,1,(真),否則即傳回,0,(偽)。,14,程式流程控制之範例九,在下例中,我們可根據向量,y,的元素值為奇數或偶數,來顯示不同的訊息:,範例,16-9 : if02.m,y = 0 3 4 1 6;,for i = 1:length(y),if rem(y(i), 2)=0,fprintf(y(%g) = %g is even.n, i, y(i);,else,fprintf(y(%g) = %g is odd.n, i, y(i);,end,end,y(1) = 0 is even.,y(2) = 3 is odd.,y(3) = 4 is even.,y(4) = 1 is odd.,y(5) = 6 is even.,上述的,if-else,為雙向條件,亦即程式只會執行運算式一或運算式 二,不會有第三種可能。,15,程式流程控制之範例十,MATLAB,亦可執行多向條件,若要進行更多向的條件,只需一再重覆,elseif,即可。例如,欲判斷,y,向量之元素是屬於,3n,、,3n,1,、 或,3n+2,,可輸入如下:,範例,16-10 : i,f03.m,y = 3 4 5 9 2;,for i = 1:length(y),if rem(y(i),3)=0,fprintf(y(%g)=%g is 3n.n, i, y(i);,elseif rem(y(i), 3)=1,fprintf(y(%g)=%g is 3n+1.n, i , y(i);,else,fprintf(y(%g)=%g is 3n+2.n, i , y(i);,end,end,y(1)=3 is 3n.,y(2)=4 is 3n+1.,y(3)=5 is 3n+2.,y(4)=9 is 3n.,y(5)=2 is 3n+2.,16,switch-case-otherwise,條件指令,MATLAB,在第五版開始支援,switch-case-otherwise,的多向條件指令,其使用語法如下:,switch expression,case value(1),statement(1),case value(2),statement(2),case value(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,指令。,17,程式流程控制之範例十一,欲根據月份來判斷其季別,可輸入如下:,範例,16-11 : switch01.m,for month = 1:12,switch month,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,Month 1 = Winter.,. .,. .,. .,Month 12 = Winter.,18,程式流程控制之範例十二,如果,expression,是字串,那麼若要在,case,之後比對多個字串,就必需使用字串的異值陣列(,Cell Arrey of Strings,):,範例,16-12 : switch02.m,month = Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep;,for i = 1:length(month),switch monthi,case Mar,Apr,May,season = Spring;,case Jun,Jul,Aug,season = Summer;,case Sep,Oct,Nov,season = Autumn;,case Dec,Jan,Feb,season = Winter;,end,fprintf(%s is %s.n, monthi, season);,end,19,程式流程控制之範例十二,上述範例,output,如下,:,Jan is Winter.,Feb is Winter.,Mar is Spring.,Apr is Spring.,May is Spring.,Jun is Summer.,Jul is Summer.,Aug is Summer.,Sep is Autumn.,MATLAB,的,switch,指令和,C,語言的,switch,指令略有差別:在,C,語言的,switch,敘述內,每個,case,敘述需加上,break,以跳出該,switch,敘述,而在,MATLAB,則不必多此一舉。,一般而言,,switch,case,otherwise,的執行效率優於,if,else,。,20,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!