《MATLAB基礎及應用》課件 第3章 流程控制語句_第1頁
《MATLAB基礎及應用》課件 第3章 流程控制語句_第2頁
《MATLAB基礎及應用》課件 第3章 流程控制語句_第3頁
《MATLAB基礎及應用》課件 第3章 流程控制語句_第4頁
《MATLAB基礎及應用》課件 第3章 流程控制語句_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

MATLAB基礎及應用曹敦虔編著第3章流程控制語句本章學習重點掌握內容:MATLAB分支語句MATLAB循環(huán)語句MATLAB函數MATLAB程序運行計時與優(yōu)化第3章流程控制語句3.1if語句3.2switch語句3.3while語句3.4for語句3.5函數3.6程序運行計時3.7養(yǎng)成良好的編程習慣3.1if語句分支結構也稱選擇結構.有時程序需要根據一定的條件來決定執(zhí)行哪些指令,這就需要用到分支結構.MATLAB有兩個分支語句:if語句和switch語句.if語句功能全面,不管是簡單的還是復雜的分支流程,if語句都能實現,所以應用最為廣泛.3.1if語句if語句的語法格式1:if

(條件表達式)

語句組end此格式用于實現單分支語句.如果條件表達式為true,則執(zhí)行語句組;否則不執(zhí)行.false條件表達式語句組true單分支語句流程圖3.1if語句例3.1輸入一個日期,求該日期是當年的第幾天.基本思路:假設年、月、日分別為y、m、d,首先計算該日期的前幾個月的總天數,即1月,2月,?,m?1月的天數之和,再加上d即可.2月的天數與當年是否是閏年有關,若是閏年則為29天,若不是閏年則為28天.3.1if語句monthdays=[312831303130313130313031];date=input('請輸入日期(格式[年月日]):');if(mod(date(1),4)==0&&mod(date(1),100)~=0||mod(date(1),400)==0)monthdays(2)=29;%閏年2月份天數為29enddays=sum(monthdays(1:date(2)-1))+date(3);disp(['是當年第',num2str(days),'天']);3.1if語句if語句的語法格式2:if

(條件表達式)

語句組1else

語句組2end格式2用于實現二分支語句.如果條件表達式為true,則執(zhí)行語句組1;否則執(zhí)行語句組2.truefalse語句組2語句組1條件表達式二分支語句流程圖3.1if語句例3.2輸入一個數,如果該數大于等于0,則輸出1,否則輸出?1.x=input('請輸入一個數:');if(x>=0)y=1;elsey=-1;endy3.1if語句if語句的語法格式3:if

(條件表達式1)

語句組1elseif(條件表達式2)

語句組2?else

語句組end格式3用于實現多分支語句.如果條件表達式1為true,則執(zhí)行語句組1;否則判斷條件表達式2,如果為true,則執(zhí)行語句組2;依次判斷各個elseif后面的條件表達式,如果為true,則執(zhí)行對應的語句組;如果所有的條件表達式都為false,則執(zhí)行else后面的語句組.3.1if語句條件表達式1truefalse語句組2語句組1條件表達式2語句組n條件表達式n其他語句組?truetruefalsefalse多分支語句流程圖3.1if語句例3.3使用if語句實現輸入一個分數,按分數輸出其等級.x=input('請輸入一個分數:');if(x>=90)y='優(yōu)';elseif(x>=80)y='良';elseif(x>=70)

y='中';elseif(x>=60)y='及格';elsey='不及格';enddisp(y);3.1if語句在if語句中,如果條件表達式的值是一個數組,則只有當數組的所有元素的值都為true時,該條件才算為true,否則只要有其中一個元素為false,則該條件為false.x=[1,5,8];if(x>=5)%x>=5的結果是[0,1,1]y=1;elsey=0;endyy=03.2switch語句switch語句適合應用于等待判斷的變量只取少數可能的值的情況,不同的取值執(zhí)行不同的流程.3.2switch語句switch語句的語法格式:switch(表達式)

case

常量1

語句組1

case

常量2

語句組2...

otherwise

其它語句組end執(zhí)行過程:計算表達式的值,按順序依次判斷表達式的值與case后面的常量是否相等,如果相等,則執(zhí)行相應的語句組.如果都不相等,則執(zhí)行otherwise后面的語句,其執(zhí)行過程與多分支的if語句類似.一般來說,由于要判斷表達式是否與某個常量相等,所以switch只適合用在表達式的值為整數、字符等離散值的情況.3.2switch語句例3.4使用switch語句實現輸入一個分數,按分數輸出其等級.基本思路:由于switch語句只能判斷有限種情形,所以不能直接使用原始分數來判斷,這里先將百分制分數變成十分制,分值為0,1,?,10共11種情形,然后再進行判斷.3.2switch語句x=input('請輸入一個分數(百分制):');switch(floor(x/10))%將百分制轉換成十分制

case10y='優(yōu)';

case9y='優(yōu)';

case8y='良';

case7y='中';

case6y='及格';

otherwisey='不及格';enddisp(y);3.3while語句當某些運算需要重復多次執(zhí)行時,可以使用循環(huán)結構來實現.使用循環(huán)可以簡化程序,提高效率.MATLAB的循環(huán)語句有兩個,while語句和for語句.while語句適合用在循環(huán)次數事先無法確定,需要根據某個條件是否成立來決定還要不要繼續(xù)執(zhí)行循環(huán)體的情形.while循環(huán)也稱為當型循環(huán).3.3while語句while語句的語法格式:while(條件表達式)

語句組end執(zhí)行過程:當條件表達式為true時,執(zhí)行語句組,結束后又判斷條件表達式是否為true,如果為true,則執(zhí)行語句組.重復這個過程,直到條件表達式為false時結束條件表達式語句組falsetrue3.3while語句例3.5輸入兩個正整數,求其最大公約數.基本思路:求兩個數m和n的最大公約數可以用“輾轉相除法”,方法如下:(1)如下m<n,則交換m和n的值;(2)計算m除以n的余數,記為r;(3)令m=n,n=r;(4)如果r=0,則m為最大公約數,結束.否則轉到(2).3.3while語句x=input('請輸入兩個正整數(格式[x,y]):');if(x(1)<x(2))%如果x(1)<x(2)則交換x(1)和x(2)x([12])=x([21]);end%使用輾轉相除法計算最大公約數r=1;while(r~=0)r=mod(x(1),x(2));x(1)=x(2);x(2)=r;enddisp(['最大公約數是',num2str(x(1))]);3.4for語句for語句是遍歷型循環(huán),類似于C#中的foreach語句.語法格式:for

循環(huán)變量

=數組

語句組end執(zhí)行過程:如果數組是一個一維數組,則循環(huán)變量依次取數組中的每一個元素,每取一個就執(zhí)行一次語句組.總執(zhí)行次數就是數組元素個數.如果數組是一個二維數組,則循環(huán)變量依次取數組中的每一列,每取一列就執(zhí)行一次語句組.總執(zhí)行次數就是數組的列數.3.4for語句例3.6輸入一個正整數n,輸出其所有因子.基本思路:依次判斷1,2,?,n,如果是n的因子,則輸出.n=input('請輸入一個正整數:');f=[];fori=1:n

if(mod(n,i)==0)f=[fi];

endenddisp([num2str(n),'的因子為',num2str(f)]);3.4for語句

3.4for語句x=input('請輸入一個正整數:');f=true;if(x<=1||x~=2&&mod(x,2)==0)%1、2以及2的倍數單獨處理

f=false;endfori=3:2:floor(sqrt(x))

if(mod(x,i)==0)f=false;

endendif(f)disp([num2str(x),'是素數']);elsedisp([num2str(x),'不是素數']);end3.4for語句例3.8求2~n之間的所有素數.方法一,對2~n之間的每一個整數依次使用上面的方法進行判斷,如果是素數,則輸出.3.4for語句n=input('請輸入一個正整數:');y=[];forx=1:nf=true;

if(x<=1||x~=2&&mod(x,2)==0)f=false;

end

fori=3:2:floor(sqrt(x))

if(mod(x,i)==0)f=false;

end

end

if(f)y=[y,x];

endendy

綜合應用實例綜合應用實例n=input('請輸入一個正整數:');y=2:n;

%y是待判斷的整數i=1;N=floor(sqrt(n));while(y(i)<=N)b=false(size(y));%生成一個與y同維的全false數組

%使用y(i)來篩除所有y(i)的倍數

forj=i+1:length(y)

if(mod(y(j),y(i))==0)b(j)=true;%如果y(j)是y(i)的倍數,則設置b(j)=1

end

endy(b)=[];%將不是素數的整數從y中刪除

i=i+1;endy綜合應用實例值得一提的是,MATLAB有很多本身具有“循環(huán)”功能的運算符和函數,很多循環(huán)語句可以使用這些運算符和函數來代替,代碼非常簡潔,并且運算速度更快.例如:計算1+2+3+?+100,如果使用循環(huán)語句來實現,程序如下:s=0;fori=1:100s=s+i;end下面的代碼也可以實現同樣的功能:s=sum(1:100);綜合應用實例

t=linspace(0,2*pi);plot(cos(t),sin(t));%畫圓axis([-11-11]);%設置顯示范圍axisequal

%設置坐標比例為等比例holdonn=200;%總投點數m=0;fori=1:nx=2*rand(1)-1;%隨機點x坐標

y=2*rand(1)-1;%隨機點y坐標

if(x*x+y*y<1)%如果隨機點在圓內

m=m+1;%計數器增1plot(x,y,'b.');

elseplot(x,y,'r.');

endendholdoffS=4*m/n%計算面積程序一:t=linspace(0,2*pi);plot(cos(t),sin(t));axis([-11-11]);axisequal;holdon;n=200;x=2*rand(n,1)-1;%生成n個隨機x坐標y=2*rand(n,1)-1;%生成n個隨機y坐標c=x.*x+y.*y<1;%根據坐標生成0-1數組,在圓內的點對應1,圓外的點對應0m=sum(c);%統計1的個數,即落在圓內的點數plot(x(c),y(c),'b.',x(~c),y(~c),'r.');holdoffS=4*m/n程序二:綜合應用實例例3.10如圖所示,多圓體是由多個圓組成的一個復合體,多個圓可能重疊,其周長是各圓露在外面部分的弧長之和.假設已知多圓體中各圓的中心坐標和半徑,求該多圓體的周長.

x=[1231.52.4];%圓心x坐標y=[011.232.5];%圓心y坐標r=[24351];%圓的半徑%畫圓t=0:0.1:2*pi;fori=1:length(x)u=x(i)+r(i)*cos(t);v=y(i)+r(i)*sin(t);

%圓周上的點plot(u,v);holdonenda=cumsum(r);%對圓的半徑進行累加a=a/a(end);

%歸一化,構造輪盤賭選擇的刻度m=0;%初始化計算器n=1000;%總投點數fori=1:nq=find(rand(1)<a,1);%隨機選擇一個圓

theta=2*pi*rand(1);%產生一隨機數

u=x(q)+r(q)*cos(theta);v=y(q)+r(q)*sin(theta);

b=(u-x).^2+(v-y).^2<r.^2;b(q)=false;

if(any(b))%判斷隨機點是否在某個圓內

plot(u,v,'go');

elsem=m+1;plot(u,v,'ro');

endendm*sum(2*pi*r)/naxisequal;holdoff;3.5函數函數是一段相對封閉獨立的程序段,用于完成一個特定的功能.函數有輸入(函數參數)和輸出(返回值),在調用函數時,只需要知道函數名(或函數句柄)、函數參數以及返回值即可,不需要知道其內部結構.使用函數可以大大提高代碼的可重用性,只需要定義一次,就可以多次調用.MATALB的大部分內置功能和工具箱都是以函數的形式存在的.MATLAB有兩種函數定義方式:匿名函數和M函數.匿名函數是一種臨時函數,一般在其定義的后面進行調用;M函數是以文件的形式存儲在磁盤文件中,只要存放在搜索路徑下或當前文件夾下,所有程序都可調用.3.5函數1.匿名函數語法格式:函數句柄

=@(參數表)函數表達式匿名函數是一種輕量級的函數,方便快捷,適合用于函數體簡單,能夠用一個表達式表示的函數.一般是在需要使用它的時候定義,也只在該程序內使用,不在多個程序之間共享.由于匿名函數沒有函數名,所以只能使用函數句柄來調用.3.5函數例3.11繪制函數y=xsin(x),x∈[?10,10]的圖形.f=@(x)x.*sin(x);%定義匿名函數x=linspace(-10,10);%對區(qū)間進行均勻剖分y=f(x);%對每一個分點,計算函數值plot(x,y);%根據數據點(x,y)畫圖y=xsin(x)的圖形3.5函數2.M函數M函數是定義在獨立M文件中的函數,與一般的M程序文件不同的是,M函數以關鍵字function開始,有輸入參數和函數值(返回值).M函數的函數名必需與文件名相同,并符合變量名命名規(guī)則.語法格式:function[函數值列表]=函數名(形式參數列表)函數體end3.5函數例3.12使用M函數定義f(x)=xsin(x).在編輯器中輸入下面程序,并保存為f.m.定義好f(x)后就可以在命令行或其它程序使用該函數了.functiony=f(x)y=x.*sin(x);end3.5函數說明:M函數通常用于實現一個相對完整的功能.當遇到return語句或最后一條語句時,M函數的執(zhí)行過程結束,此時函數值列表中的變量取值就是函數值(返回值).值得注意的是,MATLAB允許有多個函數值.M函數屬于共享函數,一旦定義好了,所有程序都可以調用.但要求M函數文件存放在MATLAB的工作目錄下,或者在MATLAB搜索路徑下.M函數具有獨立的內部工作空間,函數外部的程序代碼是無法訪問函數內部的變量的,M函數與外部交換數據一般是通過函數參數(輸入)和函數值(輸出)來進行.也可以使用全局變量在M函數和外部代碼之間共享數據.相比M程序文件,使用M函數可以在一定程度上提高程序的運行效率.MATLAB在執(zhí)行一般的M程序文件時,每次執(zhí)行都會重新加載到內存,這部分的開銷比較大.而如果是M函數,多次調用時只需要加載一次即可.3.5函數

functiony=myPiecewise1(x)%分段函數%x標量,自變量%y標量,與x對應的函數值if(x<=0)y=0;elseif(x<=1)y=2*x;elsey=2;endend3.5函數上面的函數只能接受標量作為參數,也就是說一次只能計算一個函數值,這與MATLAB的數組運算習慣不相符,為此修改如下:functiony=myPiecewise2(x)%分段函數%x數組,自變量%y數組,與x對應的函數值y=zeros(size(x));fori=1:numel(x)

if(x(i)>0&&x(i)<=1)y(i)=2*x(i);

elseif(x(i)>1)y(i)=2;

endendend3.5函數也可以使用向量化運算來實現這個過程,這種方式更加符合MATLAB的習慣.這種方式的一般格式是:(條件1).*(表達式1)+(條件2).*(表達式2)+?+(條件n).*(表達式n)functiony=myPiecewise3(x)%分段函數%x數組,自變量%y數組,與x對應的函數值y=(0<x&x<=1).*(2*x)+(1<x).*2;3.5函數函數直接或間接調用函數本身,則稱該函數為遞歸函數。如果一個問題可以通過求解該問題的更小規(guī)模問題來求解,那么這個問題就可以使用遞歸法來求解.例如要求解an,可以通過求解an?1,an?2,?來求解,那么這個問題就可以使用遞歸法來求解.如果只使用an?1則稱為單遞歸,如果使用了an?1和an?2則稱為雙遞歸,以此類推.遞歸法可以通過遞歸函數來實現.3.5函數例3.14使用遞歸法求兩個數的最大公約數.functiona=gcd(a,b)if(a<b)t=a;a=b;b=t;endif(b~=0)a=gcd(b,mod(a,b));%調用函數自身end3.5函數

functionf=fibnacci(n)%遞歸法求斐波那契數列%n整數%f斐波那契數列的第n項if(n<=2)f=1;elsef=fibnacci(n-1)+fibnacci(n-2);%遞歸end3.5函數例3.16漢諾塔問題.相傳在古印度圣廟中,有一種被稱為漢諾塔(Hanoi)的游戲.該游戲是在一塊銅板裝置上,有三根桿(編號A、B、C),在A桿自下而上、由大到小按順序放置n(n≥3)個金盤.游戲的目標:把A桿上的金盤全部移到C桿上,并仍保持原有順序疊好.操作規(guī)則:每次只能移動一個盤子,并且在移動過程中三根桿上都始終保持大盤在下,小盤在上,操作過程中盤子可以置于A、B、C任一桿上.這個問題使用遞歸法求解.算法描述為:以C盤為中介,從A桿將1至n?1號盤移至B桿;將A桿中剩下的第n號盤移至C桿;以A桿為中介;從B桿將1至n?1號盤移至C桿.3.5函數functionhanoi(n,A,B,C)%求解漢諾塔問題%n盤子個數%A盤子原來所在的柱子%B中介柱子%C目標柱子if(n==1)disp([A,'-->',C]);elsehanoi(n-1,A,C,B);disp([A,'-->',C]);hanoi(n-1,B,A,C);end3.5函數值得一提的是,雖然遞歸函數比較簡單,但是其運行效率是比較低的,尤其是出現多遞歸的時候,效率顯著降低.如果存在非遞歸方式能夠實現,建議盡量采用非遞歸方式.

例如,非遞歸的求fibnacci數列的函數如下:functionf=fibnacci2(n)%求斐波那契數列的非遞歸實現%n整數%f斐波那契數列的第n項if(n<=2)f=1;elsef1=1;f2=1;

fori=3:nf=f1+f2;f1=f2;f2=f;%更新

endend3.5函數MATLAB允許在調用M函數時實際參數少于形式參數,并在M函數內部使用nargin來獲取實際參數個數,然后根據實參個數做相應處理,常用于為函數參數提供默認值.還可以使用nargout獲取實際輸出參數個數,以便針對不同的調用方式返回不同的結果.另外,借助varargin、varargout還可以更靈活地處理參數和返回值.3.5函數例3.18定義函數,對區(qū)間[a,b]進行n等分,默認a=0,b=1,n=50.functionx=IntervalDivision(a,b,n)%對區(qū)間[a,b]進行n等分%[a,b]待劃分的區(qū)間%n等分數%x等分點if(nargin<1),a=0;end

%當實際參數少于1個時,置a=0if(nargin<2),b=1;end

%當實際參數少于2個時,置b=0if(nargin<3),n=50;end%當實際參數少于3個時,置n=50h=(b-a)/n;%小區(qū)間寬度x=a:h:b;%生成等分點,共有n+1個分點,與linspace(a,b,n+1)等價3.6程序運行計時在編寫程序時,經常要分析一段代碼的運行時間,比較程序的多種實現方式,以提高代碼質量.如何計算一段代碼的運行時間呢?MATLAB提供了多種計時方式,使用tic、toc命令;使用cputime命令;使用etime、clock命令;使用探查器.3.6程序運行計時tic和toc函數協同工作以測量經過的時間.tic開始計時,而toc結束計時,并保存

溫馨提示

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

評論

0/150

提交評論