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

下載本文檔

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

文檔簡(jiǎn)介

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

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

實(shí)際上,Matlab提供的內(nèi)部函數(shù)以及各種工具箱,都是利用Matlab命令開(kāi)發(fā)的M文件。用戶(hù)也可以結(jié)合自己的工作需要,開(kāi)發(fā)具體的程序或工具箱。M文件可以根據(jù)調(diào)用方式的不同分為兩類(lèi):命令文件(ScriptFile)和函數(shù)文件(FunctionFile)。它們的擴(kuò)展名均為m,主要區(qū)別在于:(1)命令文件沒(méi)有輸入?yún)?shù),也不返回輸出參數(shù),而函數(shù)文件可以帶輸入?yún)?shù),也可以返回輸出參數(shù)。(2)命令文件對(duì)Matlab工作空間中的變量進(jìn)行操作文件中所有命令的執(zhí)行結(jié)果也完全返回工作空間中,而函數(shù)文件中定義的變量為局部變量,當(dāng)函數(shù)文件執(zhí)行完畢時(shí),這些變量被清除。(3)命令文件可以直接運(yùn)行,在Matlab命令窗口輸入命令文件的名字,就會(huì)順序執(zhí)行命令文件中的命令,而函數(shù)文件不能直接運(yùn)行,要以函數(shù)調(diào)用的方式來(lái)調(diào)用。函數(shù)m文件的格式:function返回變量=函數(shù)名(輸入變量)注釋說(shuō)明語(yǔ)句段程序語(yǔ)句段特定規(guī)則:(1)函數(shù)m文件第一行必須以單詞function作為引導(dǎo)詞,必須遵循如下形式:function<因變量>=<函數(shù)名>(<自變量>)(2)m文件的文件名必須是<函數(shù)名>.m。(3)程序中的變量均為局部變量,不保存在工作空間中。其變量只在函數(shù)運(yùn)行期間有效。例4-1分別建立命令文件和函數(shù)文件,將華氏溫度f(wàn)轉(zhuǎn)換為攝氏溫度c。程序1:首先建立命令文件并以文件名f2c.m存盤(pán)。clear;%清除工作空間中的變量f=input('InputFahrenheittemperature:');c=5*(f-32)/9然后在MATLAB的命令窗口中輸入f2c,將會(huì)執(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建立一個(gè)命令文件將變量a,b的值互換,然后運(yùn)行該命令文件。首先建立命令文件并以文件名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:建立一個(gè)函數(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文件的建立與打開(kāi)M文件是一個(gè)文本文件,它可以用任何編輯程序來(lái)建立和編輯,而一般常用且最為方便的是使用MATLAB提供的文本編輯器meditor。1.建立新的M文件為建立新的M文件,啟動(dòng)MATLAB文本編輯器有3種方法:(1)菜單操作。從MATLAB主窗口的File菜單中選擇New菜單項(xiàng),再選擇M-file命令,屏幕上將出現(xiàn)MATLAB文本編輯器窗口。(2)命令操作。在MATLAB命令窗口輸入命令edit,啟動(dòng)MATLAB文本編輯器后,輸入M文件的內(nèi)容并存盤(pán)。(3)命令按鈕操作。單擊MATLAB主窗口工具欄上的NewM-File命令按鈕,啟動(dòng)MATLAB文本編輯器后,輸入M文件的內(nèi)容并存盤(pán)。2.打開(kāi)已有的M文件打開(kāi)已有的M文件,也有3種方法:(1)菜單操作。從MATLAB主窗口的File菜單中選擇Open命令,則屏幕出現(xiàn)Open對(duì)話(huà)框,在Open對(duì)話(huà)框中選中所需打開(kāi)的M文件。在文檔窗口可以對(duì)打開(kāi)的M文件進(jìn)行編輯修改,編輯完成后,將M文件存盤(pán)。(2)命令操作。在MATLAB命令窗口輸入命令:edit文件名,則打開(kāi)指定的M文件。(3)命令按鈕操作。單擊MATLAB主窗口工具欄上的OpenFile命令按鈕,再?gòu)膹棾龅膶?duì)話(huà)框中選擇所需打開(kāi)的M文件。4.2程序控制結(jié)構(gòu)Matlab語(yǔ)言的程序結(jié)構(gòu)與其它高級(jí)語(yǔ)言是一致的,分為順序結(jié)構(gòu),選擇結(jié)構(gòu),循環(huán)結(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è)字符串,用于提示用戶(hù)輸入什么樣的數(shù)據(jù)。如果在input函數(shù)調(diào)用時(shí)采用‘s'選項(xiàng),則允許用戶(hù)輸入一個(gè)字符串。例如,想輸入一個(gè)人的姓名,可采用命令:xm=input('What''syourname?','s');2.?dāng)?shù)據(jù)的輸出MATLAB提供的命令窗口輸出函數(shù)主要有disp函、fprintf函數(shù)。disp調(diào)用格式為disp(輸出項(xiàng))其中輸出項(xiàng)既可以為字符串,也可以為矩陣。例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ù)最常見(jiàn)的使用方式用以下例子說(shuō)明.若鍵入命令fprintf(‘圓周率pi=%10.9f’,pi)則會(huì)按浮點(diǎn)型輸出含9位小數(shù),1位整數(shù)的圓周率近似值,其輸出結(jié)果為圓周率pi=3.141592654若鍵入命令n=23;fprintf(‘n=%d’,n)則會(huì)按整型數(shù)輸出n值,其輸出結(jié)果為n=23若鍵入命令n=23;fprintf(‘n=%f’,n)n=23.0000003.程序的暫停暫停程序的執(zhí)行可以使用pause函數(shù),其調(diào)用格式為:pause(延遲秒數(shù))如果省略延遲時(shí)間,直接使用pause,則將暫停程序,直到用戶(hù)按任一鍵后程序繼續(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-4計(jì)算分段函數(shù)的值。程序如下:x=input('請(qǐng)輸入x的值:');ifx<=0y=(x+sqrt(pi))/exp(2);elsey=log(x+sqrt(1+x*x))/2;endy練習(xí):計(jì)算以下分段函數(shù)的值(3)多分支if語(yǔ)句:if條件1語(yǔ)句組1elseif條件2語(yǔ)句組2……elseif條件m語(yǔ)句組melse語(yǔ)句組nend語(yǔ)句用于實(shí)現(xiàn)多分支選擇結(jié)構(gòu)。例4-5輸入一個(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-6某商場(chǎng)對(duì)顧客所購(gòu)買(mǎi)的商品實(shí)行打折銷(xiāo)售,標(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í)際銷(xiāo)售價(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í)際銷(xiāo)售價(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-7矩陣乘法運(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)循環(huán)是指按照給定的條件,重復(fù)執(zhí)行指定的語(yǔ)句,這是一種十分重要的程序結(jié)構(gòu)。1.for語(yǔ)句for語(yǔ)句的格式為:for循環(huán)變量=表達(dá)式1:表達(dá)式2:表達(dá)式3循環(huán)體語(yǔ)句end其中表達(dá)式1的值為循環(huán)變量的初值,表達(dá)式2的值為步長(zhǎng),表達(dá)式3的值為循環(huán)變量的終值。步長(zhǎng)為1時(shí),表達(dá)式2可以省略。例4-8一個(gè)三位整數(shù)各位數(shù)字的立方和等于該數(shù)本身則稱(chēng)該數(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-9已知,當(dāng)n=100時(shí),求y的值。

程序如下:y=0;n=100;fori=1:ny=y+1/(2*i-1);endy在實(shí)際MATLAB編程中,采用循環(huán)語(yǔ)句會(huì)降低其執(zhí)行速度,所以前面的程序通常由下面的程序來(lái)代替:n=100;i=1:2:2*n-1;y=sum(1./i);yfor語(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');練習(xí):編程輸入范德蒙型的矩陣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;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語(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-12求[100,200]之間第一個(gè)能被21整除的整數(shù)。程序如下:forn=100:200ifrem(n,21)~=0continueendbreakendn例4-13:?jiǎn)栴}:從1到n的任何一個(gè)自然數(shù),只要對(duì)n反復(fù)進(jìn)行下列兩種運(yùn)算:1)如果n是偶數(shù),就除以2;2)如果n是奇數(shù),就乘以3加1,最后的結(jié)果總是1。這個(gè)問(wèn)題大約是在二十世紀(jì)五十年代被提出來(lái)的。在西方它常被稱(chēng)為西拉古斯Syracuse)猜想,因?yàn)閾?jù)說(shuō)這個(gè)問(wèn)題首先是在美國(guó)的西拉古斯大學(xué)被研究的;而在東方,這個(gè)問(wèn)題由將它帶到日本的日本數(shù)學(xué)家角谷靜夫的名字命名,被稱(chēng)作角谷猜想。角谷靜夫曾用計(jì)算機(jī)驗(yàn)算到7×1011,并未出現(xiàn)反例。1992年李文斯(G.T.Leavens)和孚門(mén)南(M.Vermeulen)也以計(jì)算機(jī)對(duì)小于5.6×1013的正整數(shù)進(jìn)行驗(yàn)證,也未發(fā)現(xiàn)反例。n=input(‘請(qǐng)輸入一個(gè)大于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)的嵌套如果一個(gè)循環(huán)結(jié)構(gòu)的循環(huán)體又包括一個(gè)循環(huán)結(jié)構(gòu),就稱(chēng)為循環(huán)的嵌套,或稱(chēng)為多重循環(huán)結(jié)構(gòu)。

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

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

fork=1:6;

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

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)的全部素?cái)?shù)。

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

m=input('m=');p=2:m;fori=2:sqrt(m)n=find(rem(p,i)==0&p~=i);p(n)=[];endp3、有五個(gè)水手帶了一只猴子來(lái)到南太平洋的一個(gè)荒島上,發(fā)現(xiàn)那里有一大堆椰子。由于旅途的顛簸,大家都很疲倦,很快就入睡了。第一個(gè)水手醒來(lái)后,把椰子平分成五堆,并將多余的一個(gè)椰子給了猴子,他私藏了一堆后便又去睡了。第二、第三、第四、第五個(gè)水手也陸續(xù)起來(lái),和第個(gè)水手一樣,把椰子平分成五堆后,將恰好多的一個(gè)也給猴子,并私藏了一堆,再去入睡。天亮以后,大家把余下的椰子重新等分成五堆,每人分一堆,正好余一個(gè)再給猴子。試問(wèn)原先共有幾個(gè)椰子?求解這一問(wèn)題可以用遞推算法。首先分析椰子數(shù)目的變化規(guī)律,設(shè)最初的椰子數(shù)為p0,即第一個(gè)水手所處理之前的椰子數(shù),用p1、p2、p3、p4、p5分別表示五個(gè)水手對(duì)椰子動(dòng)了手腳以后剩余的椰子數(shù)目,則根據(jù)問(wèn)題有p(k+1)=4/5*(p(k)-1)再用x表示最后每個(gè)水手平分得到的椰子數(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、猴子吃桃問(wèn)題:猴子第一天摘下若干個(gè)桃子,當(dāng)即吃了一半,還不過(guò)癮,又多吃了一個(gè),第二天又將剩下的桃子吃了一半,又多吃了一個(gè)。以后每天早上都吃了前一天剩下的一半零一個(gè)。到到第十天早上想再吃,只剩一個(gè)桃子。求第一天共摘多少桃子?number=1;x(10)=number;fprintf('計(jì)算結(jié)果如下:\n');fori=9:-1:1x(i)=(x(i+1)+1)*2;fprintf('第%d天有%d個(gè)桃子\n',i,x(i));end5、統(tǒng)計(jì)一個(gè)字符串里有幾個(gè)字母?程序如下:functionk=f(s)[m,n]=size(s);x=isletter(s);ifx(1)+x(n)==2%若該字符串首尾均是字母k=1;elseifx(1)+x(n)==1%若該字符串首或尾有一個(gè)且僅有一個(gè)是字母k=0;elseifx(1)+x(n)==0%若該字符串首尾均不是字母(比如標(biāo)點(diǎn)符號(hào)或空格)k=-1;endfori=1:nifx(i)==1k=k+1;endend4.3函數(shù)變量及其變量作用域在MATLAB語(yǔ)言中,變量可以分為輸入變量、輸出變量和函數(shù)內(nèi)使用的變量。輸入變量相當(dāng)于函數(shù)的入口數(shù)據(jù),也是一個(gè)函數(shù)操作的主要對(duì)象,從某種意義上說(shuō),函數(shù)的功能在于對(duì)輸入變量進(jìn)行一定的操作從而實(shí)現(xiàn)一定的功能。函數(shù)的輸入變量為局部變量,函數(shù)對(duì)輸入變量的一切操作和修改如果不依靠輸出變量的話(huà),將不會(huì)影響工作區(qū)間中該變量的值。4.3.1變量的輸入和輸出規(guī)則

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

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

除了通過(guò)全局變量共享數(shù)據(jù)外,函數(shù)式M文件還可以通過(guò)聲明一個(gè)變量persistent來(lái)對(duì)函數(shù)中重復(fù)使用和遞歸調(diào)用的變量的訪問(wèn)進(jìn)行限制,使用格式形如persistent(XYZ)。永久變量與全局變量類(lèi)似,但是它的范圍被限制在聲明這些變量的函數(shù)內(nèi)部,不允許在其他的函數(shù)中對(duì)它們進(jìn)行改變。只要M文件還在MATLAB7的內(nèi)存中,永久變量就存在。4.4函數(shù)的分類(lèi)4.4.1主函數(shù)M文件中的第一個(gè)函數(shù)就叫做主函數(shù),前邊章節(jié)中所引用的函數(shù)事實(shí)上都是主函數(shù),主函數(shù)之后可以是任意數(shù)量的子函數(shù),它們可以作為主程序的子程序。一般來(lái)說(shuō),在命令窗口或是其他的M文件只能調(diào)用主函數(shù),調(diào)用的時(shí)候就是直接調(diào)用其函數(shù)名。比如,函數(shù)average的M文件average.m如下:functiony=average(x)%AVERAGEMeanofvectorelements.y=sum(x)/length(x);%Actualcomputation4.4.2匿名函數(shù)匿名函數(shù)提供了一種創(chuàng)建簡(jiǎn)單程序的方法,使用它用戶(hù)可以不必每次都編寫(xiě)M文件。用戶(hù)可以在MATLAB7的命令窗口或是其他任意M文件和腳本文件中使用匿名函數(shù)。匿名函數(shù)的格式如下所示。fhandle=@(arglist)expr例、匿名函數(shù)舉例本例列舉3個(gè)匿名函數(shù)的例子,分別有0個(gè),1個(gè)和兩個(gè)輸入?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中,可以在一個(gè)函數(shù)的內(nèi)部定義一個(gè)或多個(gè)其他的函數(shù),這些在內(nèi)部定義的函數(shù)被稱(chēng)作嵌套式函數(shù),應(yīng)當(dāng)注意的是,在嵌套式函數(shù)的內(nèi)部也可以定義嵌套式函數(shù)。定義嵌套式函數(shù)時(shí),只需在另一個(gè)M文件的內(nèi)部定義該函數(shù)即可,同其他M文件一樣,嵌套式函數(shù)包含有M文件的所有基本部分。4.4.4子函數(shù)與其他的高級(jí)語(yǔ)言一樣,在MATLAB7語(yǔ)言中也可以很方便地定義子函數(shù),用來(lái)擴(kuò)充函數(shù)的功能。在函數(shù)文件中題頭定義的函數(shù)為主函數(shù),而在函數(shù)體內(nèi)定義的其他函數(shù)都被視為子函數(shù)。子函數(shù)只能為主函數(shù)或同一主函數(shù)下的其他子函數(shù)所使用。例、編制一函數(shù),要求任意輸入兩個(gè)數(shù)值后,用兩個(gè)子函數(shù)分別求出它們的和與它們的絕對(duì)值的和,在將這兩個(gè)和相乘。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語(yǔ)言中把放置在目錄private下的函數(shù)稱(chēng)為局部函數(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ù)句柄提供了一種間接訪問(wèn)函數(shù)的手段,用戶(hù)可以很方便地調(diào)用其他函數(shù);提供函數(shù)調(diào)用過(guò)程中的可靠性;減少程序設(shè)計(jì)中的冗余;同時(shí)可以在使用函數(shù)的過(guò)程中保存函數(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)建一個(gè)函數(shù)名的字符串str2func由一個(gè)函數(shù)名的字符串創(chuàng)建一個(gè)函數(shù)句柄save從當(dāng)前工作區(qū)間向M文件保存函數(shù)句柄load從一個(gè)M文件中向當(dāng)前工作區(qū)間調(diào)用函數(shù)句柄isa判斷一個(gè)變量是否包含由一個(gè)函數(shù)句柄isequal判斷2個(gè)函數(shù)句柄是否為某一相同函數(shù)的句柄4.4程序設(shè)計(jì)的輔助函數(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計(jì)算工作區(qū)間中的表達(dá)式feval字符串調(diào)用M文件run運(yùn)行腳本文件容錯(cuò)函數(shù)程序設(shè)計(jì)的好壞在很大程度上取決于其容錯(cuò)能力的大小。MATLAB7語(yǔ)言提供了相應(yīng)的報(bào)錯(cuò)及警告函數(shù)error、warning、lasterr、lastwarn以及errortrapon/off等,可以很方便地實(shí)現(xiàn)這方面的功能。時(shí)間運(yùn)算函數(shù)

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

數(shù)

名功

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論