第4章 MATLAB程序流程控制_第1頁(yè)
第4章 MATLAB程序流程控制_第2頁(yè)
第4章 MATLAB程序流程控制_第3頁(yè)
第4章 MATLAB程序流程控制_第4頁(yè)
第4章 MATLAB程序流程控制_第5頁(yè)
已閱讀5頁(yè),還剩52頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章MATLAB程序流程控制4.1M文件4.2程序控制結(jié)構(gòu)4.3函數(shù)文件4.4特殊形式的函數(shù)4.5程序調(diào)試與優(yōu)化4.1.1M文件的建立與打開(kāi)M文件是一個(gè)文本文件,它可以用任何編輯程序來(lái)建立和編輯,而一般常用且最為方便的是使用MATLAB提供的文本編輯器。1.建立新的M文件為建立新的M文件,啟動(dòng)MATLAB編輯器有3種方法。①在MATLAB主窗口選擇“主頁(yè)”選項(xiàng)卡,在“文件”命令組中單擊“新建腳本”命令按鈕。4.1M文件②在MATLAB命令行窗口輸入命令:edit文件名啟動(dòng)MATLAB編輯器后,輸入M文件的內(nèi)容并存盤(pán)。③在命令歷史窗口選中一些命令(按住Ctrl可同時(shí)選擇多條命令),然后從右鍵快捷菜單中選擇“創(chuàng)建腳本”命令,將會(huì)啟動(dòng)MATLAB編輯器,并在編輯區(qū)中加入所選中的命令。2.打開(kāi)已有的M文件打開(kāi)已有的M文件,也有3種方法:

(1)菜單操作。在MATLAB主窗口選擇“主頁(yè)”選項(xiàng)卡,在“文件”命令組中單擊“打開(kāi)”命令按鈕,再?gòu)膹棾龅南吕藛沃羞x擇“打開(kāi)”命令,從“打開(kāi)”對(duì)話框中選擇所需打開(kāi)的M文件。

(2)命令操作。在MATLAB命令窗口輸入命令:edit文件名,則打開(kāi)指定的M文件。

(3)命令按鈕操作。單擊MATLAB主窗口工具欄上的OpenFile命令按鈕,再?gòu)膹棾龅膶?duì)話框中選擇所需打開(kāi)的M文件。4.1.2M文件的分類用MATLAB語(yǔ)言編寫(xiě)的程序,稱為M文件。M文件可以根據(jù)調(diào)用方式的不同分為兩類:腳本文件(ScriptFile)和函數(shù)文件(FunctionFile)。腳本文件和函數(shù)文件的主要區(qū)別如下:①腳本文件沒(méi)有輸入?yún)?shù),也不返回輸出參數(shù),而函數(shù)文件可以帶輸入?yún)?shù),也可返回輸出參數(shù)。②腳本文件對(duì)MATLAB工作空間中的變量進(jìn)行操作,文件中所有命令的執(zhí)行結(jié)果也完全返回到工作空間中,而函數(shù)文件中定義的變量為局部變量,當(dāng)函數(shù)文件執(zhí)行完畢時(shí),這些變量被清除。③腳本文件可以直接運(yùn)行,在MATLAB命令行窗口輸入腳本文件的名字,就會(huì)順序執(zhí)行腳本文件中的命令,而函數(shù)文件不能直接運(yùn)行,而要以函數(shù)調(diào)用的方式來(lái)調(diào)用它。例4-1建立一個(gè)命令文件將變量a,b的值互換,然后運(yùn)行該命令文件。程序1:首先建立命令文件并以文件名exch.m存盤(pán):clear;a=1:10;b=[11,12,13,14;15,16,17,18];c=a;a=b;b=c;ab然后在MATLAB的命令窗口中輸入exch,將會(huì)執(zhí)行該命令文件。

程序2:首先建立函數(shù)文件fexch.m:function[a,b]=exch(a,b)c=a;a=b;b=c;然后在MATLAB的命令窗口調(diào)用該函數(shù)文件:clear;x=1:10;y=[11,12,13,14;15,16,17,18];[x,y]=fexch(x,y)4.2程序控制結(jié)構(gòu)

4.2.1順序結(jié)構(gòu)1.?dāng)?shù)據(jù)的輸入從鍵盤(pán)輸入數(shù)據(jù),則可以使用input函數(shù)來(lái)進(jìn)行,該函數(shù)的調(diào)用格式為:

A=input(提示信息,選項(xiàng));其中提示信息為一個(gè)字符串,用于提示用戶輸入什么樣的數(shù)據(jù)。如果在input函數(shù)調(diào)用時(shí)采用's'選項(xiàng),則允許用戶輸入一個(gè)字符串。例如:xm=input('What''syourname?','s');2.?dāng)?shù)據(jù)的輸出

MATLAB提供的命令窗口輸出函數(shù)主要有disp函數(shù),其調(diào)用格式為

disp(輸出項(xiàng))其中輸出項(xiàng)既可以為字符串,也可以為矩陣。例4-2求一元二次方程ax2+bx+c=0的根。程序如下:a=input('a=?');b=input('b=?');c=input('c=?');d=b*b-4*a*c;x=[(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)];disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);3.程序的暫停暫停程序的執(zhí)行可以使用pause函數(shù),其調(diào)用格式為:

pause(延遲秒數(shù))

如果省略延遲時(shí)間,直接使用pause,則將暫停程序,直到用戶按任一鍵后程序繼續(xù)執(zhí)行。若要強(qiáng)行中止程序的運(yùn)行可使用Ctrl+C命令。4.2.2選擇結(jié)構(gòu)1.if語(yǔ)句在MATLAB中,if語(yǔ)句有3種格式。

(1)單分支if語(yǔ)句:if條件語(yǔ)句組

end當(dāng)條件成立時(shí),則執(zhí)行語(yǔ)句組,執(zhí)行完之后繼續(xù)執(zhí)行if語(yǔ)句的后繼語(yǔ)句,若條件不成立,則直接執(zhí)行if語(yǔ)句的后繼語(yǔ)句。(2)雙分支if語(yǔ)句:

if條件語(yǔ)句組1else

語(yǔ)句組2end

當(dāng)條件成立時(shí),執(zhí)行語(yǔ)句組1,否則執(zhí)行語(yǔ)句組2,語(yǔ)句組1或語(yǔ)句組2執(zhí)行后,再執(zhí)行if語(yǔ)句的后繼語(yǔ)句。例4-3計(jì)算分段函數(shù)。程序如下:x=input('請(qǐng)輸入x的值:');ifx==10y=cos(x+1)+sqrt(x*x+1);elsey=x*sqrt(x+sqrt(x));endy(3)多分支if語(yǔ)句:if條件1

語(yǔ)句組1elseif條件2

語(yǔ)句組2……elseif條件m

語(yǔ)句組melse

語(yǔ)句組nend例4-4輸入一個(gè)字符,若為大寫(xiě)字母,則輸出其對(duì)應(yīng)的小寫(xiě)字母;若為小寫(xiě)字母,則輸出其對(duì)應(yīng)的大寫(xiě)字母;若為數(shù)字字符則輸出其對(duì)應(yīng)的數(shù)值,若為其他字符則原樣輸出。c=input('請(qǐng)輸入一個(gè)字符','s');ifc>='A'&c<='Z'disp(setstr(abs(c)+abs('a')-abs('A')));elseifc>='a'&c<='z'disp(setstr(abs(c)-abs('a')+abs('A')));elseifc>='0'&c<='9'disp(abs(c)-abs('0'));elsedisp(c);end2.switch語(yǔ)句

switch語(yǔ)句根據(jù)表達(dá)式的取值不同,分別執(zhí)行不同的語(yǔ)句,其語(yǔ)句格式為:

switch表達(dá)式

case表達(dá)式1

語(yǔ)句組1case表達(dá)式2

語(yǔ)句組2……case表達(dá)式m

語(yǔ)句組motherwise

語(yǔ)句組nend當(dāng)表達(dá)式的值等于表達(dá)式1的值時(shí),執(zhí)行語(yǔ)句組1,當(dāng)表達(dá)式的值等于表達(dá)式2的值時(shí),執(zhí)行語(yǔ)句組2,…,當(dāng)表達(dá)式的值等于表達(dá)式m的值時(shí),執(zhí)行語(yǔ)句組m,當(dāng)表達(dá)式的值不等于case所列的表達(dá)式的值時(shí),執(zhí)行語(yǔ)句組n。當(dāng)任意一個(gè)分支的語(yǔ)句執(zhí)行完后,直接執(zhí)行switch語(yǔ)句的下一句。例4-5某商場(chǎng)對(duì)顧客所購(gòu)買的商品實(shí)行打折銷售,標(biāo)準(zhǔn)如下(商品價(jià)格用price來(lái)表示):

price<200沒(méi)有折扣

200≤price<5003%折扣

500≤price<10005%折扣

1000≤price<25008%折扣

2500≤price<500010%折扣5000≤price14%折扣輸入所售商品的價(jià)格,求其實(shí)際銷售價(jià)格。price=input('請(qǐng)輸入商品價(jià)格');switchfix(price/100)case{0,1}%價(jià)格小于200rate=0;case{2,3,4}%價(jià)格大于等于200但小于500rate=3/100;casenum2cell(5:9)%價(jià)格大于等于500但小于1000rate=5/100;casenum2cell(10:24)%價(jià)格大于等于1000但小于2500rate=8/100;casenum2cell(25:49)%價(jià)格大于等于2500但小于5000rate=10/100;otherwise%價(jià)格大于等于5000rate=14/100;endprice=price*(1-rate)%輸出商品實(shí)際銷售價(jià)格3.try語(yǔ)句語(yǔ)句格式為:try

語(yǔ)句組1catch

語(yǔ)句組2endtry語(yǔ)句先試探性執(zhí)行語(yǔ)句組1,如果語(yǔ)句組1在執(zhí)行過(guò)程中出現(xiàn)錯(cuò)誤,則將錯(cuò)誤信息賦給保留的lasterr變量,并轉(zhuǎn)去執(zhí)行語(yǔ)句組2。例4-6矩陣乘法運(yùn)算要求兩矩陣的維數(shù)相容,否則會(huì)出錯(cuò)。先求兩矩陣的乘積,若出錯(cuò),則自動(dòng)轉(zhuǎn)去求兩矩陣的點(diǎn)乘。A=[1,2,3;4,5,6];B=[7,8,9;10,11,12];tryC=A*B;catchC=A.*B;endClasterr%顯示出錯(cuò)原因4.2.3循環(huán)結(jié)構(gòu)1.for語(yǔ)句for語(yǔ)句的格式為:for循環(huán)變量=表達(dá)式1:表達(dá)式2:表達(dá)式3

循環(huán)體語(yǔ)句

end其中,“表達(dá)式1:表達(dá)式2:表達(dá)式3”是一個(gè)冒號(hào)表達(dá)式,將產(chǎn)生一個(gè)行向量,3個(gè)表達(dá)式分別代表初值、步長(zhǎng)和終值。步長(zhǎng)為1時(shí),表達(dá)式2可以省略。例4-7一個(gè)三位整數(shù)各位數(shù)字的立方和等于該數(shù)本身則稱該數(shù)為水仙花數(shù)。輸出全部水仙花數(shù)。程序如下:form=100:999m1=fix(m/100);%求m的百位數(shù)字m2=rem(fix(m/10),10);%求m的十位數(shù)字m3=rem(m,10);%求m的個(gè)位數(shù)字ifm==m1*m1*m1+m2*m2*m2+m3*m3*m3disp(m)endend例4-8已知當(dāng)n=100時(shí),求y的值。程序如下:y=0;n=100;fori=1:ny=y+1/i/i;endy

在實(shí)際MATLAB編程中,采用循環(huán)語(yǔ)句會(huì)降低其執(zhí)行速度,所以前面的程序通常由下面的程序來(lái)代替:n=100;i=1:n;f=1./i.^2;y=sum(f)例4-9設(shè),求s=以梯形法為例,程序如下:a=0;b=3*pi;n=1000;h=(b-a)/n;x=a;s=0;f0=exp(-0.5*x)*sin(x+pi/6);fori=1:nx=x+h;f1=exp(-0.5*x)*sin(x+pi/6);s=s+(f0+f1)*h/2;f0=f1;endsfor語(yǔ)句更一般的格式為:

for循環(huán)變量=矩陣表達(dá)式循環(huán)體語(yǔ)句

end

執(zhí)行過(guò)程是依次將矩陣的各列元素賦給循環(huán)變量,然后執(zhí)行循環(huán)體語(yǔ)句,直至各列元素處理完畢。

例4-10寫(xiě)出下列程序的執(zhí)行結(jié)果。

s=0;a=[12,13,14;15,16,17;18,19,20;21,22,23];fork=as=s+k;enddisp(s');2.while語(yǔ)句

while語(yǔ)句的一般格式為:

while(條件)

循環(huán)體語(yǔ)句

end

其執(zhí)行過(guò)程為:若條件成立,則執(zhí)行循環(huán)體語(yǔ)句,執(zhí)行后再判斷條件是否成立,如果不成立則跳出循環(huán)。例4-11從鍵盤(pán)輸入若干個(gè)數(shù),當(dāng)輸入0時(shí)結(jié)束輸入,求這些數(shù)的平均值和它們之和。程序如下:sum=0;n=0;val=input('Enteranumber(endin0):');while(val~=0)sum=sum+val;n=n+1;val=input('Enteranumber(endin0):');endif(n>0)summean=sum/nend例4-12根據(jù)矩陣指數(shù)的冪級(jí)數(shù)展開(kāi)式求矩陣指數(shù)。程序如下:X=input('EnterX:');E=zeros(size(X));F=eye(size(X));n=1;whilenorm(F,1)>0E=E+F;F=F*X/n;n=n+1;endEexpm(X)

3.break語(yǔ)句和continue語(yǔ)句與循環(huán)結(jié)構(gòu)相關(guān)的語(yǔ)句還有break語(yǔ)句和continue語(yǔ)句。它們一般與if語(yǔ)句配合使用。

break語(yǔ)句用于終止循環(huán)的執(zhí)行。當(dāng)在循環(huán)體內(nèi)執(zhí)行到該語(yǔ)句時(shí),程序?qū)⑻鲅h(huán),繼續(xù)執(zhí)行循環(huán)語(yǔ)句的下一語(yǔ)句。

continue語(yǔ)句控制跳過(guò)循環(huán)體中的某些語(yǔ)句。當(dāng)在循環(huán)體內(nèi)執(zhí)行到該語(yǔ)句時(shí),程序?qū)⑻^(guò)循環(huán)體中所有剩下的語(yǔ)句,繼續(xù)下一次循環(huán)。例4-13求[100,200]之間第一個(gè)能被21整除的整數(shù)。程序如下:forn=100:200ifrem(n,21)~=0continueendbreakendn4.循環(huán)的嵌套如果一個(gè)循環(huán)結(jié)構(gòu)的循環(huán)體又包括一個(gè)循環(huán)結(jié)構(gòu),就稱為循環(huán)的嵌套,或稱為多重循環(huán)結(jié)構(gòu)。例4-14若一個(gè)數(shù)等于它的各個(gè)真因子之和,則稱該數(shù)為完數(shù),如6=1+2+3,所以6是完數(shù)。求[1,500]之間的全部完數(shù)。form=1:500s=0;fork=1:m/2ifrem(m,k)==0s=s+k;endendifm==sdisp(m);endend例4-15用篩選法求某自然數(shù)范圍內(nèi)的全部素?cái)?shù)。m=input('m=');p=1:m;p(1)=0;fori=2:sqrt(m)forj=2*i:i:mp(j)=0;endendn=find(p~=0);p(n)4.3函數(shù)文件4.3.1函數(shù)文件的基本結(jié)構(gòu)函數(shù)文件由function語(yǔ)句引導(dǎo),其基本結(jié)構(gòu)為:

function輸出形參表=函數(shù)名(輸入形參表)

注釋說(shuō)明部分函數(shù)體語(yǔ)句其中以function開(kāi)頭的一行為引導(dǎo)行,表示該M文件是一個(gè)函數(shù)文件。函數(shù)名的命名規(guī)則與變量名相同。輸入形參為函數(shù)的輸入?yún)?shù),輸出形參為函數(shù)的輸出參數(shù)。當(dāng)輸出形參多于一個(gè)時(shí),則應(yīng)該用方括號(hào)括起來(lái)。例4-16編寫(xiě)函數(shù)文件求半徑為r的圓的面積和周長(zhǎng)。函數(shù)文件如下:function[s,p]=fcircle(r)%CIRCLEcalculatetheareaandperimeterofacircleofradiir%r圓半徑%s圓面積%p圓周長(zhǎng)%2006年2月30日編s=pi*r*r;p=2*pi*r;4.3.2函數(shù)調(diào)用1.函數(shù)調(diào)用的一般格式是:

[輸出實(shí)參表]=函數(shù)名(輸入實(shí)參表)

要注意的是,函數(shù)調(diào)用時(shí)各實(shí)參出現(xiàn)的順序、個(gè)數(shù),應(yīng)與函數(shù)定義時(shí)形參的順序、個(gè)數(shù)一致,否則會(huì)出錯(cuò)。函數(shù)調(diào)用時(shí),先將實(shí)參傳遞給相應(yīng)的形參,從而實(shí)現(xiàn)參數(shù)傳遞,然后再執(zhí)行函數(shù)的功能。例4-17利用函數(shù)文件,實(shí)現(xiàn)直角坐標(biāo)(x,y)與極坐標(biāo)(ρ,θ)之間的轉(zhuǎn)換。函數(shù)文件tran.m:function[rho,theta]=tran(x,y)rho=sqrt(x*x+y*y);theta=atan(y/x);

調(diào)用tran.m的命令文件main1.m:x=input('Pleaseinputx=:');y=input('Pleaseinputy=:');[rho,the]=tran(x,y);rhothe2.函數(shù)的遞歸調(diào)用在MATLAB中,函數(shù)可以嵌套調(diào)用,即一個(gè)函數(shù)可以調(diào)用別的函數(shù),甚至調(diào)用它自身。一個(gè)函數(shù)調(diào)用它自身稱為函數(shù)的遞歸調(diào)用。例4-18利用函數(shù)的遞歸調(diào)用,求n!。

n!本身就是以遞歸的形式定義的:顯然,求n!需要求(n-1)!,這時(shí)可采用遞歸調(diào)用。遞歸調(diào)用函數(shù)文件factor.m如下:functionf=factor(n)ifn<=1f=1;elsef=factor(n-1)*n;%遞歸調(diào)用求(n-1)!end例4-19任意排列問(wèn)題。MATLAB提供的函數(shù)randperm(n),可以產(chǎn)生一個(gè)從整數(shù)1到整數(shù)n的任意排列。編寫(xiě)一個(gè)函數(shù)來(lái)實(shí)現(xiàn)randperm(n)函數(shù)的功能,即給出一個(gè)由任意數(shù)組成的行向量,然后產(chǎn)生這個(gè)行向量元素的任意排列。4.3.3函數(shù)參數(shù)的可調(diào)性在調(diào)用函數(shù)時(shí),MATLAB用兩個(gè)永久變量nargin和nargout分別記錄調(diào)用該函數(shù)時(shí)的輸入實(shí)參和輸出實(shí)參的個(gè)數(shù)。只要在函數(shù)文件中包含這兩個(gè)變量,就可以準(zhǔn)確地知道該函數(shù)文件被調(diào)用時(shí)的輸入輸出參數(shù)個(gè)數(shù),從而決定函數(shù)如何進(jìn)行處理。例4-20nargin用法示例。函數(shù)文件examp.m:functionfout=charray(a,b,c)ifnargin==1fout=a;elseifnargin==2fout=a+b;elseifnargin==3fout=(a*b*c)/2;end命令文件mydemo.m:x=[1:3];y=[1;2;3];examp(x)examp(x,y')examp(x,y,3)4.3.4全局變量與局部變量函數(shù)文件中的變量是局部的,即在一個(gè)函數(shù)文件中定義的變量不能被另一個(gè)函數(shù)文件引用。如果在若干函數(shù)中都把某一變量定義為全局變量,那么這些函數(shù)將共用這個(gè)變量,作用域是整個(gè)工作空間,即全程有效。全局變量用global命令定義,格式為:global變量名例4-21全局變量應(yīng)用示例。先建立函數(shù)文件wadd.m,該函數(shù)將輸入的參數(shù)加權(quán)相加。functionf=wadd(x,y)globalALPHABETAf=ALPHA*x+BETA*y;在命令窗口中輸入:globalALPHABETAALP

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論