第四章 MATLAB 程序設(shè)計_第1頁
第四章 MATLAB 程序設(shè)計_第2頁
第四章 MATLAB 程序設(shè)計_第3頁
第四章 MATLAB 程序設(shè)計_第4頁
第四章 MATLAB 程序設(shè)計_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第四章MATLAB程序設(shè)計

Matlab語言與其他計算機(jī)語言一樣,可以用來編程。充分利用Matlab數(shù)據(jù)結(jié)構(gòu)的特點(diǎn),可以使程序結(jié)構(gòu)簡單,編程效率高。本章主要介紹有關(guān)Matlab程序控制結(jié)構(gòu)以及數(shù)學(xué)上常用到的程序設(shè)計的基本方法。教學(xué)過程M文件介紹程序控制結(jié)構(gòu)函數(shù)變量及其變量作用域子函數(shù)與局部函數(shù)程序設(shè)計的輔助函數(shù)程序的調(diào)試和優(yōu)化4.1M文件介紹4.1.1M文件概述用MATLAB語言編寫的程序,稱為M文件。M文件是由若干Matlab命令構(gòu)成的,它可以完成某些操作,也可以實現(xiàn)某種算法。

實際上,Matlab提供的內(nèi)部函數(shù)以及各種工具箱,都是利用Matlab命令開發(fā)的M文件。用戶也可以結(jié)合自己的工作需要,開發(fā)具體的程序或工具箱。M文件可以根據(jù)調(diào)用方式的不同分為兩類:命令文件(ScriptFile)和函數(shù)文件(FunctionFile)。它們的擴(kuò)展名均為m,主要區(qū)別在于:(1)命令文件沒有輸入?yún)?shù),也不返回輸出參數(shù),而函數(shù)文件可以帶輸入?yún)?shù),也可以返回輸出參數(shù)。(2)命令文件對Matlab工作空間中的變量進(jìn)行操作文件中所有命令的執(zhí)行結(jié)果也完全返回工作空間中,而函數(shù)文件中定義的變量為局部變量,當(dāng)函數(shù)文件執(zhí)行完畢時,這些變量被清除。(3)命令文件可以直接運(yùn)行,在Matlab命令窗口輸入命令文件的名字,就會順序執(zhí)行命令文件中的命令,而函數(shù)文件不能直接運(yùn)行,要以函數(shù)調(diào)用的方式來調(diào)用。函數(shù)m文件的格式:function返回變量=函數(shù)名(輸入變量)注釋說明語句段程序語句段特定規(guī)則:(1)函數(shù)m文件第一行必須以單詞function作為引導(dǎo)詞,必須遵循如下形式:function<因變量>=<函數(shù)名>(<自變量>)(2)m文件的文件名必須是<函數(shù)名>.m。(3)程序中的變量均為局部變量,不保存在工作空間中。其變量只在函數(shù)運(yùn)行期間有效。例4-1分別建立命令文件和函數(shù)文件,將華氏溫度f轉(zhuǎn)換為攝氏溫度c。程序1:首先建立命令文件并以文件名f2c.m存盤。clear;%清除工作空間中的變量f=input('InputFahrenheittemperature:');c=5*(f-32)/9然后在MATLAB的命令窗口中輸入f2c,將會執(zhí)行該命令文件,執(zhí)行情況為:InputFahrenheittemperature:73c=22.7778程序2:首先建立函數(shù)文件f2c.m。functionc=f2c(f)c=5*(f-32)/9然后在MATLAB的命令窗口調(diào)用該函數(shù)文件。clear;y=input('InputFahrenheittemperature:');x=f2c(y)輸出情況為:InputFahrenheittemperature:70c=21.1111x=21.1111例4-2建立一個命令文件將變量a,b的值互換,然后運(yùn)行該命令文件。首先建立命令文件并以文件名exch.m存盤:clear;a=1:10;b=[11,12,13,14;15,16,17,18];c=a;a=b;b=c;ab然后在MATLAB的命令窗口中輸入exch,將會執(zhí)行該命令文件。程序2:建立一個函數(shù)文件將變量a,b的值互換,然后在命令窗口調(diào)用該函數(shù)文件。首先建立函數(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.1.2M文件的建立與打開M文件是一個文本文件,它可以用任何編輯程序來建立和編輯,而一般常用且最為方便的是使用MATLAB提供的文本編輯器meditor。1.建立新的M文件為建立新的M文件,啟動MATLAB文本編輯器有3種方法:(1)菜單操作。從MATLAB主窗口的File菜單中選擇New菜單項,再選擇M-file命令,屏幕上將出現(xiàn)MATLAB文本編輯器窗口。(2)命令操作。在MATLAB命令窗口輸入命令edit,啟動MATLAB文本編輯器后,輸入M文件的內(nèi)容并存盤。(3)命令按鈕操作。單擊MATLAB主窗口工具欄上的NewM-File命令按鈕,啟動MATLAB文本編輯器后,輸入M文件的內(nèi)容并存盤。2.打開已有的M文件打開已有的M文件,也有3種方法:(1)菜單操作。從MATLAB主窗口的File菜單中選擇Open命令,則屏幕出現(xiàn)Open對話框,在Open對話框中選中所需打開的M文件。在文檔窗口可以對打開的M文件進(jìn)行編輯修改,編輯完成后,將M文件存盤。(2)命令操作。在MATLAB命令窗口輸入命令:edit文件名,則打開指定的M文件。(3)命令按鈕操作。單擊MATLAB主窗口工具欄上的OpenFile命令按鈕,再從彈出的對話框中選擇所需打開的M文件。4.2程序控制結(jié)構(gòu)Matlab語言的程序結(jié)構(gòu)與其它高級語言是一致的,分為順序結(jié)構(gòu),選擇結(jié)構(gòu),循環(huán)結(jié)構(gòu)。4.2.1順序結(jié)構(gòu)1.?dāng)?shù)據(jù)的輸入從鍵盤輸入數(shù)據(jù),則可以使用input函數(shù)來進(jìn)行,該函數(shù)的調(diào)用格式為:A=input(提示信息,選項);其中提示信息為一個字符串,用于提示用戶輸入什么樣的數(shù)據(jù)。如果在input函數(shù)調(diào)用時采用‘s'選項,則允許用戶輸入一個字符串。例如,想輸入一個人的姓名,可采用命令:xm=input('What''syourname?','s');2.?dāng)?shù)據(jù)的輸出MATLAB提供的命令窗口輸出函數(shù)主要有disp函、fprintf函數(shù)。disp調(diào)用格式為disp(輸出項)其中輸出項既可以為字符串,也可以為矩陣。例4-3求一元二次方程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))]);fprintf函數(shù)最常見的使用方式用以下例子說明.若鍵入命令fprintf(‘圓周率pi=%10.9f’,pi)則會按浮點(diǎn)型輸出含9位小數(shù),1位整數(shù)的圓周率近似值,其輸出結(jié)果為圓周率pi=3.141592654若鍵入命令n=23;fprintf(‘n=%d’,n)則會按整型數(shù)輸出n值,其輸出結(jié)果為n=23若鍵入命令n=23;fprintf(‘n=%f’,n)n=23.0000003.程序的暫停暫停程序的執(zhí)行可以使用pause函數(shù),其調(diào)用格式為:pause(延遲秒數(shù))如果省略延遲時間,直接使用pause,則將暫停程序,直到用戶按任一鍵后程序繼續(xù)執(zhí)行。若要強(qiáng)行中止程序的運(yùn)行可使用Ctrl+C命令。4.2.2選擇結(jié)構(gòu)1.if語句在MATLAB中,if語句有3種格式。(1)單分支if語句:if條件語句組end當(dāng)條件成立時,則執(zhí)行語句組,執(zhí)行完之后繼續(xù)執(zhí)行if語句的后繼語句,若條件不成立,則直接執(zhí)行if語句的后繼語句。(2)雙分支if語句:if條件語句組1else語句組2end當(dāng)條件成立時,執(zhí)行語句組1,否則執(zhí)行語句組2,語句組1或語句組2執(zhí)行后,再執(zhí)行if語句的后繼語句。例4-4計算分段函數(shù)的值。程序如下:x=input('請輸入x的值:');ifx<=0y=(x+sqrt(pi))/exp(2);elsey=log(x+sqrt(1+x*x))/2;endy練習(xí):計算以下分段函數(shù)的值(3)多分支if語句:if條件1語句組1elseif條件2語句組2……elseif條件m語句組melse語句組nend語句用于實現(xiàn)多分支選擇結(jié)構(gòu)。例4-5輸入一個字符,若為大寫字母,則輸出其對應(yīng)的小寫字母;若為小寫字母,則輸出其對應(yīng)的大寫字母;若為數(shù)字字符則輸出其對應(yīng)的數(shù)值,若為其他字符則原樣輸出。c=input('請輸入一個字符','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語句switch語句根據(jù)表達(dá)式的取值不同,分別執(zhí)行不同的語句,其語句格式為:switch表達(dá)式case表達(dá)式1語句組1case表達(dá)式2語句組2……case表達(dá)式m語句組motherwise語句組nend當(dāng)表達(dá)式的值等于表達(dá)式1的值時,執(zhí)行語句組1,當(dāng)表達(dá)式的值等于表達(dá)式2的值時,執(zhí)行語句組2,…,當(dāng)表達(dá)式的值等于表達(dá)式m的值時,執(zhí)行語句組m,當(dāng)表達(dá)式的值不等于case所列的表達(dá)式的值時,執(zhí)行語句組n。當(dāng)任意一個分支的語句執(zhí)行完后,直接執(zhí)行switch語句的下一句。例4-6某商場對顧客所購買的商品實行打折銷售,標(biāo)準(zhǔn)如下(商品價格用price來表示):price<200沒有折扣200≤price<5003%折扣500≤price<10005%折扣1000≤price<25008%折扣2500≤price<500010%折扣5000≤price14%折扣輸入所售商品的價格,求其實際銷售價格。程序如下:price=input('請輸入商品價格');switchfix(price/100)case{0,1}%價格小于200rate=0;case{2,3,4}%價格大于等于200但小于500rate=3/100;casenum2cell(5:9)%價格大于等于500但小于1000rate=5/100;casenum2cell(10:24)%價格大于等于1000但小于2500rate=8/100;casenum2cell(25:49)%價格大于等于2500但小于5000rate=10/100;otherwise%價格大于等于5000rate=14/100;endprice=price*(1-rate)%輸出商品實際銷售價格3.try語句語句格式為:try語句組1catch語句組2endtry語句先試探性執(zhí)行語句組1,如果語句組1在執(zhí)行過程中出現(xiàn)錯誤,則將錯誤信息賦給保留的lasterr變量,并轉(zhuǎn)去執(zhí)行語句組2。例4-7矩陣乘法運(yùn)算要求兩矩陣的維數(shù)相容,否則會出錯。先求兩矩陣的乘積,若出錯,則自動轉(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%顯示出錯原因4.2.3循環(huán)結(jié)構(gòu)循環(huán)是指按照給定的條件,重復(fù)執(zhí)行指定的語句,這是一種十分重要的程序結(jié)構(gòu)。1.for語句for語句的格式為:for循環(huán)變量=表達(dá)式1:表達(dá)式2:表達(dá)式3循環(huán)體語句end其中表達(dá)式1的值為循環(huán)變量的初值,表達(dá)式2的值為步長,表達(dá)式3的值為循環(huán)變量的終值。步長為1時,表達(dá)式2可以省略。例4-8一個三位整數(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的個位數(shù)字ifm==m1*m1*m1+m2*m2*m2+m3*m3*m3disp(m)endend例4-9已知,當(dāng)n=100時,求y的值。

程序如下:y=0;n=100;fori=1:ny=y+1/(2*i-1);endy在實際MATLAB編程中,采用循環(huán)語句會降低其執(zhí)行速度,所以前面的程序通常由下面的程序來代替:n=100;i=1:2:2*n-1;y=sum(1./i);yfor語句更一般的格式為:for循環(huán)變量=矩陣表達(dá)式循環(huán)體語句end執(zhí)行過程是依次將矩陣的各列元素賦給循環(huán)變量,然后執(zhí)行循環(huán)體語句,直至各列元素處理完畢。例4-10寫出下列程序的執(zhí)行結(jié)果。s=0;a=[12,13,14;15,16,17;18,19,20;21,22,23];fork=as=s+k;enddisp(s');練習(xí):編程輸入范德蒙型的矩陣2.while語句while語句的一般格式為:while(條件)循環(huán)體語句end其執(zhí)行過程為:若條件成立,則執(zhí)行循環(huán)體語句,執(zhí)行后再判斷條件是否成立,如果不成立則跳出循環(huán)。例4-11從鍵盤輸入若干個數(shù),當(dāng)輸入0時結(jié)束輸入,求這些數(shù)的平均值和它們之和。程序如下:sum=0;cnt=0;val=input('Enteranumber(endin0):');while(val~=0)sum=sum+val;cnt=cnt+1;val=input('Enteranumber(endin0):');endif(cnt>0)summean=sum/cntend3.break語句和continue語句與循環(huán)結(jié)構(gòu)相關(guān)的語句還有break語句和continue語句。它們一般與if語句配合使用。break語句用于終止循環(huán)的執(zhí)行。當(dāng)在循環(huán)體內(nèi)執(zhí)行到該語句時,程序?qū)⑻鲅h(huán),繼續(xù)執(zhí)行循環(huán)語句的下一語句。continue語句控制跳過循環(huán)體中的某些語句。當(dāng)在循環(huán)體內(nèi)執(zhí)行到該語句時,程序?qū)⑻^循環(huán)體中所有剩下的語句,繼續(xù)下一次循環(huán)。例4-12求[100,200]之間第一個能被21整除的整數(shù)。程序如下:forn=100:200ifrem(n,21)~=0continueendbreakendn例4-13:問題:從1到n的任何一個自然數(shù),只要對n反復(fù)進(jìn)行下列兩種運(yùn)算:1)如果n是偶數(shù),就除以2;2)如果n是奇數(shù),就乘以3加1,最后的結(jié)果總是1。這個問題大約是在二十世紀(jì)五十年代被提出來的。在西方它常被稱為西拉古斯Syracuse)猜想,因為據(jù)說這個問題首先是在美國的西拉古斯大學(xué)被研究的;而在東方,這個問題由將它帶到日本的日本數(shù)學(xué)家角谷靜夫的名字命名,被稱作角谷猜想。角谷靜夫曾用計算機(jī)驗算到7×1011,并未出現(xiàn)反例。1992年李文斯(G.T.Leavens)和孚門南(M.Vermeulen)也以計算機(jī)對小于5.6×1013的正整數(shù)進(jìn)行驗證,也未發(fā)現(xiàn)反例。n=input(‘請輸入一個大于1的正整數(shù)n=’);ifn<=0disp(‘輸入的數(shù)為負(fù)數(shù)或零,程序中斷’)breakendwhilen>1

ifrem(n,2)==0

n=n/2

elsen=n*3+1

endend

4.循環(huán)的嵌套如果一個循環(huán)結(jié)構(gòu)的循環(huán)體又包括一個循環(huán)結(jié)構(gòu),就稱為循環(huán)的嵌套,或稱為多重循環(huán)結(jié)構(gòu)。

例4-13若一個數(shù)等于它的各個真因子之和,則稱該數(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);endend4.2.5程序舉例1、猜數(shù)游戲。首先由計算機(jī)產(chǎn)生[1,100]之間的隨機(jī)整數(shù),然后由用戶猜測所產(chǎn)生的隨機(jī)數(shù)。根據(jù)用戶猜測的情況給出不同提示,如猜測的數(shù)大于產(chǎn)生的數(shù),則顯示“您的數(shù)字較大!”,小于則顯示“您的數(shù)字較小!'”,等于則顯示“YOUWIN!”,同時退出游戲。用戶最多可以猜6次。

y=round(10+89*rand());

fork=1:6;

x=input(['第',num2str(k),'次輸入一個兩位數(shù)(輸完請按回車):']);

if(x<y)

'您的數(shù)字較小!'

elseif(x==y)

msgbox('YOUWIN!');

return;

else

'您的數(shù)字較大!'

end

end

if(k==6)

msgbox('YOULOSE!

GAMEOVER!')

end

end2、用篩選法求某自然數(shù)范圍內(nèi)的全部素數(shù)。

素數(shù)是大于1,且除了1和它本身以外,不能被其他任何整數(shù)所整除的整數(shù)。用篩選法求素數(shù)的基本思想是:要找出2~m之間的全部素數(shù),首先在2~m中劃去2的倍數(shù)(不包括2),然后劃去3的倍數(shù)(不包括3),由于4已被劃去,再找5的倍數(shù)(不包括5),…,直到再劃去不超過的數(shù)的倍數(shù),剩下的數(shù)都是素數(shù)。

m=input('m=');p=2:m;fori=2:sqrt(m)n=find(rem(p,i)==0&p~=i);p(n)=[];endp3、有五個水手帶了一只猴子來到南太平洋的一個荒島上,發(fā)現(xiàn)那里有一大堆椰子。由于旅途的顛簸,大家都很疲倦,很快就入睡了。第一個水手醒來后,把椰子平分成五堆,并將多余的一個椰子給了猴子,他私藏了一堆后便又去睡了。第二、第三、第四、第五個水手也陸續(xù)起來,和第個水手一樣,把椰子平分成五堆后,將恰好多的一個也給猴子,并私藏了一堆,再去入睡。天亮以后,大家把余下的椰子重新等分成五堆,每人分一堆,正好余一個再給猴子。試問原先共有幾個椰子?求解這一問題可以用遞推算法。首先分析椰子數(shù)目的變化規(guī)律,設(shè)最初的椰子數(shù)為p0,即第一個水手所處理之前的椰子數(shù),用p1、p2、p3、p4、p5分別表示五個水手對椰子動了手腳以后剩余的椰子數(shù)目,則根據(jù)問題有p(k+1)=4/5*(p(k)-1)再用x表示最后每個水手平分得到的椰子數(shù),于是有x=1/5*(p5-1)所以p5=5x+1利用逆向遞推的方法,有

n=input('inputn:');forx=1:np=5*x+1;fork=1:5p=5*p/4+1;endifp==fix(p)breakendenddisp([x,p])4、猴子吃桃問題:猴子第一天摘下若干個桃子,當(dāng)即吃了一半,還不過癮,又多吃了一個,第二天又將剩下的桃子吃了一半,又多吃了一個。以后每天早上都吃了前一天剩下的一半零一個。到到第十天早上想再吃,只剩一個桃子。求第一天共摘多少桃子?number=1;x(10)=number;fprintf('計算結(jié)果如下:\n');fori=9:-1:1x(i)=(x(i+1)+1)*2;fprintf('第%d天有%d個桃子\n',i,x(i));end5、統(tǒng)計一個字符串里有幾個字母?程序如下:functionk=f(s)[m,n]=size(s);x=isletter(s);ifx(1)+x(n)==2%若該字符串首尾均是字母k=1;elseifx(1)+x(n)==1%若該字符串首或尾有一個且僅有一個是字母k=0;elseifx(1)+x(n)==0%若該字符串首尾均不是字母(比如標(biāo)點(diǎn)符號或空格)k=-1;endfori=1:nifx(i)==1k=k+1;endend4.3函數(shù)變量及其變量作用域在MATLAB語言中,變量可以分為輸入變量、輸出變量和函數(shù)內(nèi)使用的變量。輸入變量相當(dāng)于函數(shù)的入口數(shù)據(jù),也是一個函數(shù)操作的主要對象,從某種意義上說,函數(shù)的功能在于對輸入變量進(jìn)行一定的操作從而實現(xiàn)一定的功能。函數(shù)的輸入變量為局部變量,函數(shù)對輸入變量的一切操作和修改如果不依靠輸出變量的話,將不會影響工作區(qū)間中該變量的值。4.3.1變量的輸入和輸出規(guī)則

MATLAB可以有任意數(shù)量的輸入和輸出變量。這些參數(shù)的特性和規(guī)則如下:函數(shù)式M文件可以沒有輸入和輸出變量。函數(shù)可以用比M文件中的函數(shù)定義行所規(guī)定的輸入輸出變量更少的變量進(jìn)行調(diào)用。但是不能用比規(guī)定的輸入輸出變量更多的變量進(jìn)行調(diào)用。在一次調(diào)用中所用到的輸入和輸出變量的個數(shù)可以通過分別調(diào)用函數(shù)nargin和nargout來確定。因為nargin和nargout是函數(shù)而不是變量,所以用戶不能用諸如nargin=nargin+pi之類的語句對它們進(jìn)行重新賦值。當(dāng)一個函數(shù)被調(diào)用時,輸入變量并沒有被復(fù)制到函數(shù)的工作區(qū)間中,但是它們的值在這個函數(shù)是可讀的。應(yīng)當(dāng)注意的是,如果輸入變量的任何值被改變了,這個輸入變量組就被復(fù)制到了函數(shù)的工作區(qū)。

如果一個函數(shù)聲明了一個或者多個輸出變量,但是用戶在使用的時候又不想要輸出參數(shù),則只要不把輸出變量賦值給任何變量就可以了;或者在函數(shù)結(jié)束之前用函數(shù)clear刪除這些變量。函數(shù)可以通過在函數(shù)聲明中將varargin作為最后的輸入?yún)?shù),接受可變的任意個數(shù)的輸入?yún)?shù)。Varargin是一個預(yù)先定義的單元數(shù)組,這個單元數(shù)組的第i個單元就是varargin程序的位置算起的第i個變量。通過函數(shù)聲明行中將varargout作為最后的輸出變量,函數(shù)可以接受任意個數(shù)的變量形式的輸出參數(shù)。Varargout也是一個預(yù)先定義的單元數(shù)組,這個單元數(shù)組的第i個單元就是從varargout的出現(xiàn)位置算起的第i個變量。函數(shù)nargchk和nargoutch分別提供了對有效地輸入和輸出變量個數(shù)的簡單錯誤校驗,因為如果函數(shù)調(diào)用的輸入或者輸出變量的個數(shù)多于函數(shù)定義中出現(xiàn)的個數(shù),函數(shù)都自動地返回一個錯誤,因此雖然這些函數(shù)的作用有限,但是在一個函數(shù)定義聲明了任意數(shù)目的輸入變量和輸出變量的時候卻是非常有用的。例、nargin函數(shù)的初級使用方法。解:本程序?qū)崿F(xiàn)如下功能,當(dāng)調(diào)用過程時小于或等于一個變量時,系統(tǒng)提示錯誤的輸入,當(dāng)有兩個變量時,程序?qū)蓚€數(shù)相加,當(dāng)有3個變量時,將前兩個數(shù)相加并減去第3個。程序如下:functiond=nargintest(a,b,c)ifnargin<=1error(‘Notenoughinputarguments’)elseifnargin==2d=a+b;elseifnargin==3d=a+b+cend此外,使用nargin可以查找函數(shù)輸入變量的個數(shù),例如,想要查找上述nargintest函數(shù)的參數(shù)個數(shù),可以使用命令nargin(‘nargintest’)4.3.2局部變量局部變量是在函數(shù)內(nèi)部使用的變量,其影響范圍只能在本函數(shù)內(nèi),每個函數(shù)在運(yùn)行時,都占有獨(dú)立的函數(shù)工作空間,此工作空間和MATLAB的工作空間時相互獨(dú)立的,局部變量僅存在于函數(shù)的工作空間內(nèi)。當(dāng)函數(shù)執(zhí)行完畢之后,該變量即自行消失。4.3.3全局變量在Matlab中,函數(shù)內(nèi)部定義的變量都是局部變量,它們不被加載到工作區(qū)間中。有時,用戶需要使用全局變量,這時要使用global函數(shù)來進(jìn)行定義,而且在任何使用該全局變量的函數(shù)中都應(yīng)加以定義,即使是在命令窗口也不例外。例全局變量應(yīng)用示例。先建立函數(shù)文件wadd.m,該函數(shù)將輸入的參數(shù)加權(quán)相加。functionf=wadd(x,y)globalALPHABETAf=ALPHA*x+BETA*y;在命令窗口中輸入:globalALPHABETAALPHA=1;BETA=2;s=wadd(1,2)4.3.4永久變量

除了通過全局變量共享數(shù)據(jù)外,函數(shù)式M文件還可以通過聲明一個變量persistent來對函數(shù)中重復(fù)使用和遞歸調(diào)用的變量的訪問進(jìn)行限制,使用格式形如persistent(XYZ)。永久變量與全局變量類似,但是它的范圍被限制在聲明這些變量的函數(shù)內(nèi)部,不允許在其他的函數(shù)中對它們進(jìn)行改變。只要M文件還在MATLAB7的內(nèi)存中,永久變量就存在。4.4函數(shù)的分類4.4.1主函數(shù)M文件中的第一個函數(shù)就叫做主函數(shù),前邊章節(jié)中所引用的函數(shù)事實上都是主函數(shù),主函數(shù)之后可以是任意數(shù)量的子函數(shù),它們可以作為主程序的子程序。一般來說,在命令窗口或是其他的M文件只能調(diào)用主函數(shù),調(diào)用的時候就是直接調(diào)用其函數(shù)名。比如,函數(shù)average的M文件average.m如下:functiony=average(x)%AVERAGEMeanofvectorelements.y=sum(x)/length(x);%Actualcomputation4.4.2匿名函數(shù)匿名函數(shù)提供了一種創(chuàng)建簡單程序的方法,使用它用戶可以不必每次都編寫M文件。用戶可以在MATLAB7的命令窗口或是其他任意M文件和腳本文件中使用匿名函數(shù)。匿名函數(shù)的格式如下所示。fhandle=@(arglist)expr例、匿名函數(shù)舉例本例列舉3個匿名函數(shù)的例子,分別有0個,1個和兩個輸入?yún)?shù)。t=@()datestr(now);t()28-Oct-201011:21:34sqrt=@(x)x.^2sqrt(12)sumAxBy=@(x,y)(14*x+41*y)sumAxBy(3,7)4.4.3嵌套式函數(shù)在MATLAB7中,可以在一個函數(shù)的內(nèi)部定義一個或多個其他的函數(shù),這些在內(nèi)部定義的函數(shù)被稱作嵌套式函數(shù),應(yīng)當(dāng)注意的是,在嵌套式函數(shù)的內(nèi)部也可以定義嵌套式函數(shù)。定義嵌套式函數(shù)時,只需在另一個M文件的內(nèi)部定義該函數(shù)即可,同其他M文件一樣,嵌套式函數(shù)包含有M文件的所有基本部分。4.4.4子函數(shù)與其他的高級語言一樣,在MATLAB7語言中也可以很方便地定義子函數(shù),用來擴(kuò)充函數(shù)的功能。在函數(shù)文件中題頭定義的函數(shù)為主函數(shù),而在函數(shù)體內(nèi)定義的其他函數(shù)都被視為子函數(shù)。子函數(shù)只能為主函數(shù)或同一主函數(shù)下的其他子函數(shù)所使用。例、編制一函數(shù),要求任意輸入兩個數(shù)值后,用兩個子函數(shù)分別求出它們的和與它們的絕對值的和,在將這兩個和相乘。functionch=zihanshu(x,y)ch=zihanshu1(x,y)*zihanshu2(x,y);functionch=zihanshu1(x,y)ch=abs(x)+abs(y);functionch=zihanshu2(x,y)ch=x+y;4.4.5局部函數(shù)MATLAB7語言中把放置在目錄private下的函數(shù)稱為局部函數(shù),這些函數(shù)只有private目錄的父目錄中的函數(shù)才可以調(diào)用,其他目錄下的函數(shù)不能調(diào)用。局部函數(shù)與子函數(shù)所不同的是,局部函數(shù)可以被其父目錄下的所有函數(shù)所調(diào)用,而子函數(shù)則只能被其所在的M文件的主函數(shù)所調(diào)用。所以,局部函數(shù)在可用的范圍上大于子函數(shù);在函數(shù)編輯的結(jié)構(gòu)上,局部函數(shù)與一般的函數(shù)文件的編輯相同,而子函數(shù)只能在主函數(shù)文件中編輯。4.4.6函數(shù)句柄函數(shù)句柄提供了一種間接訪問函數(shù)的手段,用戶可以很方便地調(diào)用其他函數(shù);提供函數(shù)調(diào)用過程中的可靠性;減少程序設(shè)計中的冗余;同時可以在使用函數(shù)的過程中保存函數(shù)相關(guān)的信息,尤其是關(guān)于函數(shù)執(zhí)行的信息。函數(shù)句柄的創(chuàng)建

定義函數(shù)句柄的定義只需在提示符@后添加相應(yīng)函數(shù)的函數(shù)名,使用格式形如:fhandle=@functionname其中fhandle為所創(chuàng)建的函數(shù)句柄,functionname為所創(chuàng)建的函數(shù)。trigFun={@sin,@cos,@tan};plot(trigFun{2}(-pi:0.01:pi))函數(shù)句柄的調(diào)用functionx=plotFHandle(fhandle,data)plot(data,fhandle(data))在命令窗口中調(diào)用程序如下:plotFHandle(@sin,-pi:0.01:pi)函數(shù)句柄的操作函

數(shù)

名功

述functions返回函數(shù)句柄的相關(guān)信息func2str根據(jù)函數(shù)句柄創(chuàng)建一個函數(shù)名的字符串str2func由一個函數(shù)名的字符串創(chuàng)建一個函數(shù)句柄save從當(dāng)前工作區(qū)間向M文件保存函數(shù)句柄load從一個M文件中向當(dāng)前工作區(qū)間調(diào)用函數(shù)句柄isa判斷一個變量是否包含由一個函數(shù)句柄isequal判斷2個函數(shù)句柄是否為某一相同函數(shù)的句柄4.4程序設(shè)計的輔助函數(shù)4.4.1執(zhí)行函數(shù)執(zhí)行函數(shù)及其功能函

數(shù)

名功

述assignin在MATLAB7工作區(qū)間中分配變量builtin外部加載調(diào)用內(nèi)置函數(shù)eval字符串調(diào)用函數(shù)evalc執(zhí)行MATLAB7的表達(dá)式evalin計算工作區(qū)間中的表達(dá)式feval字符串調(diào)用M文件run運(yùn)行腳本文件容錯函數(shù)程序設(shè)計的好壞在很大程度上取決于其容錯能力的大小。MATLAB7語言提供了相應(yīng)的報錯及警告函數(shù)error、warning、lasterr、lastwarn以及errortrapon/off等,可以很方便地實現(xiàn)這方面的功能。時間運(yùn)算函數(shù)

常用的時間控制函數(shù)及其功能函

數(shù)

名功

述clock以向量的形式顯示當(dāng)前的時間和日期date以字符型顯示當(dāng)前的日期now以數(shù)值型顯示當(dāng)前的時間和日期calendar顯示當(dāng)月的日歷表weekday顯示當(dāng)前日期對應(yīng)的星期表達(dá)eomday給出指定年月的當(dāng)月最后一天datetick指定坐標(biāo)軸的日期表達(dá)形式datevec轉(zhuǎn)換為向量形式顯示日期4.5程序的調(diào)試和優(yōu)化程序的

溫馨提示

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

評論

0/150

提交評論