Matlab-程序設(shè)計(jì)和M文件課件_第1頁(yè)
Matlab-程序設(shè)計(jì)和M文件課件_第2頁(yè)
Matlab-程序設(shè)計(jì)和M文件課件_第3頁(yè)
Matlab-程序設(shè)計(jì)和M文件課件_第4頁(yè)
Matlab-程序設(shè)計(jì)和M文件課件_第5頁(yè)
已閱讀5頁(yè),還剩73頁(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)介

第5章程序設(shè)計(jì)和M文件

5.1程序控制5.2M文件結(jié)構(gòu)5.3函數(shù)的使用5.4程序的調(diào)試5.5匿名函數(shù)、inline對(duì)象和函數(shù)句柄5.6函數(shù)繪圖5.7數(shù)值分析Matlab_程序設(shè)計(jì)和M文件5.1程序控制三種常用的結(jié)構(gòu):順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。4種程序流程控制語(yǔ)句:分支控制語(yǔ)句、循環(huán)控制語(yǔ)句、錯(cuò)誤控制語(yǔ)句和流程控制語(yǔ)句。Matlab_程序設(shè)計(jì)和M文件5.1.1分支控制語(yǔ)句——

實(shí)現(xiàn)滿足一定條件就執(zhí)行相應(yīng)分支的功能。1.if結(jié)構(gòu)

if

條件1

語(yǔ)句段1

elseif

條件2

語(yǔ)句段2 ......

else

語(yǔ)句段n

endMatlab_程序設(shè)計(jì)和M文件例5-1x=-5:0.1:5;ifx>=1y=x.^2-1;elseif-1<x<1y=0;elsey=-x.^2-1;endplot(x,y);Matlab_程序設(shè)計(jì)和M文件2.switch結(jié)構(gòu)——

常用于各種條件的列舉。switch

表達(dá)式

case

值1

語(yǔ)句段1

case值2

語(yǔ)句段2 ...

otherwise

語(yǔ)句段n

end說(shuō)明:(1)表達(dá)式只能是標(biāo)量或字符串;(2)case后面的值可以是標(biāo)量、字符串或元胞數(shù)組;(3)switch和end必須配對(duì)使用。Matlab_程序設(shè)計(jì)和M文件例5-2

使用switch結(jié)構(gòu)判斷學(xué)生成績(jī)的等級(jí),90分以上為優(yōu),80~90為良,70~80為中,60~70為及格,60分以下為不及格。score=98;s1=fix(score/10); %取十位數(shù)switchs1

case{9,10}s='優(yōu)'

case8s='良'

case7s='中'

case6s='及格'

otherwises='不及格'ends=優(yōu)Matlab_程序設(shè)計(jì)和M文件5.1.2循環(huán)控制語(yǔ)句——

實(shí)現(xiàn)將某段程序重復(fù)執(zhí)行。1.for循環(huán)

for

循環(huán)變量=array

循環(huán)體

end

說(shuō)明:array可以是向量也可以是矩陣,循環(huán)執(zhí)行的次數(shù)就是array的列數(shù),每次循環(huán)中循環(huán)變量依次取array的各列并執(zhí)行循環(huán)體,直到array所有列取完。練習(xí)Matlab_程序設(shè)計(jì)和M文件forn=1:5 %循環(huán)5次forn=-1:0.1:1 %循環(huán)21次forn=linspace(-2*pi,2*pi,5) %循環(huán)5次a=eye(2,3);forn=a %循環(huán)3次,n為列向量例5-3x=eye(5);len=length(x)forn=1:lenx(n,n)=nendlen=5x=1000001000001000001000001x=1000002000001000001000001…x=1000002000003000004000005Matlab_程序設(shè)計(jì)和M文件or:x=eye(5);forn=1:length(x)x(n,:)=x(n,:)*nendMatlab_程序設(shè)計(jì)和M文件2.while循環(huán)——常用于預(yù)先知道循環(huán)條件或循環(huán)結(jié)束條件的情況。

while

條件表達(dá)式 循環(huán)體

end例5-4

使用while循環(huán)計(jì)算f(x)=sin(x),x<5且每次x遞增ln(x)。x=0.1;whilex<5

f=sin(x)x=x+log(x)endf=-4.0651e+002-1.5921e+003ix=5.5640+9.2717iMatlab_程序設(shè)計(jì)和M文件3.break和continue語(yǔ)句——控制循環(huán)的流程。(1)break語(yǔ)句

break語(yǔ)句使包含break的最內(nèi)層for或while循環(huán)強(qiáng)制終止,并立即跳出該循環(huán)結(jié)構(gòu),執(zhí)行end后面的命令,break一般與if語(yǔ)句結(jié)合使用。(2)continue語(yǔ)句

continue語(yǔ)句與break不同的是continue只結(jié)束本次for或while循環(huán),而繼續(xù)進(jìn)行下次循環(huán),continue一般也與if語(yǔ)句結(jié)合使用。Matlab_程序設(shè)計(jì)和M文件eg.for循環(huán)中的break語(yǔ)句forii=1:5ifii==3;break;endfprintf('ii=%d\n',ii);enddisp('Endofloop!');結(jié)果:ii=1ii=2Endofloop!Matlab_程序設(shè)計(jì)和M文件eg.for

中的continue

語(yǔ)句forii=1:5ifii==3;continue;end

fprintf('ii=%d\n',ii);enddisp('Endofloop!');結(jié)果:ii=1ii=2ii=4ii=5Endofloop!Matlab_程序設(shè)計(jì)和M文件【例5-5】計(jì)算f(x)=ex,使用break語(yǔ)句當(dāng)f(x)>1000時(shí)終止計(jì)算。x=0:10;forn=xf=exp(n);

iff>1000break

endendn=7f=1.0966e+003Matlab_程序設(shè)計(jì)和M文件例5-6

使用for循環(huán)將字符串中的數(shù)值取出,遇到非數(shù)值則跳過(guò)。str='Theresultis100.';len=length(str);s=[];forn=1:len

ifstr(n)>'9'|str(n)<'0' %非數(shù)值時(shí)

continue

ends=[sstr(n)]ends=1s=10s=100Matlab_程序設(shè)計(jì)和M文件相當(dāng)于:str='Theresultis100.';len=length(str);s=[]forn=1:len

ifstr(n)>='0‘&str(n)<='9's=[sstr(n)]endendMatlab_程序設(shè)計(jì)和M文件5.1.3錯(cuò)誤控制語(yǔ)句——

當(dāng)程序可能出現(xiàn)運(yùn)行錯(cuò)誤時(shí),可以使用錯(cuò)誤控制結(jié)構(gòu)來(lái)捕獲和處理錯(cuò)誤,避免程序出錯(cuò)而不能繼續(xù)運(yùn)行。

try

語(yǔ)句段1

catch

語(yǔ)句段2

end執(zhí)行過(guò)程:先試探地執(zhí)行語(yǔ)句段1,如果出現(xiàn)錯(cuò)誤則將錯(cuò)誤信息賦給保留的lasterr變量,并放棄語(yǔ)句段1轉(zhuǎn)而執(zhí)行語(yǔ)句段2中的語(yǔ)句;如果語(yǔ)句段2正確則結(jié)束;當(dāng)語(yǔ)句段1和語(yǔ)句段2都錯(cuò)誤,則程序出錯(cuò)。如果語(yǔ)句段1正確則不執(zhí)行語(yǔ)句段2就結(jié)束;Matlab_程序設(shè)計(jì)和M文件例5-7>>a=[135];>>b=[123];>>tryc=a.*b'catchc=a.*b;end>>cc=1615>>[lastmsg,lastid]=lasterrlastmsg=Errorusing==>timesMatrixdimensionsmustagree.lastid=MATLAB:dimagreeMatlab_程序設(shè)計(jì)和M文件例5-7-2a=[123]b=[456]tryc=a*b;disp('tryisexcute')catchc=a.*b;disp('catchisexcute')endcMatlab_程序設(shè)計(jì)和M文件5.1.4流程控制命令1.return命令return命令:(1)用于結(jié)束程序的執(zhí)行,并立即返回到上一級(jí)調(diào)用函數(shù)

(2)終止鍵盤方式注意:當(dāng)程序進(jìn)入死(無(wú)限)循環(huán)時(shí),則按Ctrl+break鍵來(lái)終止程序的運(yùn)行。2.keyboard命令keyboard命令用來(lái)使程序暫停運(yùn)行,等待鍵盤命令,命令窗口出現(xiàn)“K>>”提示符,當(dāng)鍵盤輸入“return”后,程序才繼續(xù)運(yùn)行。keyboard命令可以用來(lái)在程序調(diào)試或程序執(zhí)行時(shí)修改變量。Matlab_程序設(shè)計(jì)和M文件a=[135];keyboardtryc=a.*b';catchc=a.*b;endcMatlab_程序設(shè)計(jì)和M文件3.input命令

a=input(‘Placeenteradata:’);

r=input(‘str’,‘s’)%從鍵盤中輸入字符串保存到變量r4.disp命令disp命令是較常用的顯示命令,常用來(lái)顯示字符串型的信息提示。5.pause命令pause命令用來(lái)使程序暫停運(yùn)行,當(dāng)用戶按任意鍵才繼續(xù)執(zhí)行。常用于程序調(diào)試或查看中間結(jié)果,也可以用來(lái)控制執(zhí)行的速度。pause的命令格式如下:pause(n)

%暫停n秒練習(xí)Matlab_程序設(shè)計(jì)和M文件5.2M文件結(jié)構(gòu)MATLAB7.3的程序如果要保存則使用擴(kuò)展名是“.m”的M文件,M文件有兩種即M腳本文件(ScriptFile)和M函數(shù)文件(FunctionFile)。Matlab_程序設(shè)計(jì)和M文件5.2.1M文件的一般結(jié)構(gòu)1.函數(shù)聲明行函數(shù)聲明行是在M函數(shù)文件的第一行,只有M函數(shù)文件必須有,以“function”引導(dǎo)并指定函數(shù)名、輸入和輸出參數(shù),M腳本文件沒(méi)有函數(shù)聲明行。2.H1行H1行是幫助文字的第一行。3.幫助文本4.程序代碼

程序代碼由MATLAB語(yǔ)句和注釋語(yǔ)句構(gòu)成。Matlab_程序設(shè)計(jì)和M文件5.2.2M腳本文件和M函數(shù)文件1.M腳本文件格式:通常為一連串指令,沒(méi)有函數(shù)聲明行,無(wú)輸入和輸出參數(shù).M腳本文件的說(shuō)明:(1)運(yùn)行腳本文件時(shí),只是簡(jiǎn)單地按順序從文件中讀取一條條命令,送到MATLAB命令窗口中去執(zhí)行;(2)M腳本文件運(yùn)行產(chǎn)生的變量都駐留在MATLAB的基本工作空間中,在命令窗口中運(yùn)行的命令可以使用這些變量;(3)腳本文件的命令可以訪問(wèn)工作空間的所有數(shù)據(jù),因此要注意避免工作空間和腳本文件中的同名變量相互覆蓋,一般在M腳本文件的開(kāi)頭使用“clear”命令清除工作空間的變量。Matlab_程序設(shè)計(jì)和M文件例5-8

在M文件編輯/調(diào)試器窗口中編寫M腳本文件得出10~50范圍內(nèi)的所有素?cái)?shù)。%EX5_8計(jì)算10~50內(nèi)的素?cái)?shù)cleary1=primes(50); %獲得50以內(nèi)的所有素?cái)?shù)n=length(primes(10)); %獲得10以內(nèi)素?cái)?shù)的個(gè)數(shù)y=y1(n+1:end)在命令窗口中輸入:>>ex5_8y=1113171923293137414347在工作空間中就可以查看到變量y1、n和y,并可以修改和使用這些變量。練習(xí)

PRIMES(N)isarowvectoroftheprimenumberslessthanorequaltoN.Aprimenumberisonethathasnofactorsotherthan1anditself.Matlab_程序設(shè)計(jì)和M文件2.M函數(shù)文件格式:有函數(shù)聲明行,可以輸入?yún)?shù)和輸出參數(shù)。M函數(shù)文件的說(shuō)明如下:(1)M函數(shù)文件在運(yùn)行過(guò)程中產(chǎn)生的變量都存放在函數(shù)本身的工作空間中。函數(shù)的工作空間隨具體的M函數(shù)文件調(diào)用而產(chǎn)生,并隨調(diào)用結(jié)束而刪除,如果運(yùn)行多個(gè)函數(shù)則產(chǎn)生多個(gè)臨時(shí)的函數(shù)工作空間;(2)當(dāng)文件執(zhí)行完最后一條命令或遇到“return”命令時(shí)就結(jié)束函數(shù)文件的運(yùn)行,同時(shí)函數(shù)工作空間的變量被清除;(3)一個(gè)M函數(shù)文件至少要定義一個(gè)函數(shù)。Matlab_程序設(shè)計(jì)和M文件函數(shù)聲明行的格式:function[輸出參數(shù)列表]=函數(shù)名(輸入?yún)?shù)列表)

說(shuō)明:函數(shù)名是函數(shù)的名稱,保存時(shí)最好函數(shù)名與文件名一致,當(dāng)不一致時(shí),MATLAB以文件名為準(zhǔn);輸入?yún)?shù)列表是函數(shù)接收的輸入?yún)?shù),多個(gè)參數(shù)間用“,”分隔;輸出參數(shù)列表是函數(shù)運(yùn)算的結(jié)果,多個(gè)參數(shù)間用“,”分隔。Matlab_程序設(shè)計(jì)和M文件函數(shù)定義的形式舉例:定義多輸入輸出參數(shù)的函數(shù)

function[x,y,z]=sphere(theta,phi,rho)無(wú)輸入?yún)?shù)的函數(shù)

functiony=sphere(orsphere())無(wú)輸出參數(shù)的函數(shù)

functionsphere(x)(orfunction[]=sphere(x))Matlab_程序設(shè)計(jì)和M文件例5-9

將例5-7的計(jì)算行向量乘積的運(yùn)算使用M函數(shù)文件保存。functionc=ex5_9(a,b)%EX5_9(a,b)returnstheproductofaandb%cistheproduct%aisthemultiplier%bisthemultiplicand%copyright2007-10-01

tryc=a.*b';catchc=a.*b;end調(diào)用該函數(shù):>>z=ex5_9([123],[456])z=41018Matlab_程序設(shè)計(jì)和M文件例:functiondistance=dist2(x1,y1,x2,y2)%DIST2Calculatethedistancebetweentwopoints%FunctionDIST2calculatesthedistancebetween%twopoints(x1,y1)and(x2,y2)inaCartesiancoordinatesystem.%%Callingsequence:%res=dist2(xl,y1,x2,y2)%Definevariables:%x1--x-positionofpoint1%y1--y-positionofpoint1%x2--x-positionofpoint2%y2--y-positionofpoint2%distance--Distancebetweenpoints%Recordofrevisions:%DateProgrammerDescriptionofchange%12/15/98S.J.ChapmanOriginalcode%Calculatedistance.distance=sqrt((x2-x1).^2+(y2-y1).^2);Matlab_程序設(shè)計(jì)和M文件使用該函數(shù)的腳本文件如下:%Scriptfile:test_dist2.m%Purpose:%Thisprogramtestsfunctiondist2.%Recordofrevisions:%DateProgrammerDescriptionofchange%12/15/98S.J.Chapmanoriginalcode%Definevariables:%ax--x-positionofpointa%ay--y-positionofpointa%bx--x-positionofpointb%by--y-positionofpointb%result--DistancebetweenthepointsMatlab_程序設(shè)計(jì)和M文件%Getinputdata.disp('Calculatethedistancebetweentwopoints:');ax=input('Enterxvalueofpointa:');ay=input('Enteryvalueofpointa:');bx=input('Enterxvalueofpointb:');by=input('Enteryvalueofpointb:');%Evaluatefunctionresult=dist2(ax,ay,bx,by);%Writeoutresult.fprintf('Thedistancebetweenpointsaandbis%f\n',result);Matlab_程序設(shè)計(jì)和M文件直接在命令窗口調(diào)用該函數(shù):>>test_dist2Calculatethedistancebetweentwopoints:Enterxvalueofpointa:1Enteryvalueofpointa:1Enterxvalueofpointb:4Enteryvalueofpointb:5Thedistancebetweenpointsaandbis5.000000Matlab_程序設(shè)計(jì)和M文件>>helpdist2DIST2CalculatethedistancebetweentwopointsFunctionDIST2calculatesthedistancebetweentwopoints(xl,yl)and(x2,y2)inaCartesiancoordinatesystem.Callingsequence:res=dist2(xl,y1,x2,y2)……Matlab_程序設(shè)計(jì)和M文件5.3函數(shù)的使用模塊化程序設(shè)計(jì):將一個(gè)大任務(wù)分成若干小的子任務(wù),用一個(gè)一個(gè)的函數(shù)完成這些子任務(wù),通過(guò)函數(shù)間的調(diào)用完成復(fù)雜任務(wù).優(yōu)點(diǎn):易于維護(hù)和修改程序.注意:主函數(shù)可以調(diào)用子函數(shù),子函數(shù)可以調(diào)用其他子函數(shù)或本身,但子函數(shù)不能調(diào)用主函數(shù).Matlab_程序設(shè)計(jì)和M文件5.3.1主函數(shù)和子函數(shù)一個(gè)M函數(shù)文件中可以包含一個(gè)或多個(gè)函數(shù).1.主函數(shù)主函數(shù)是出現(xiàn)在文件最上方的函數(shù),即第一行聲明的函數(shù).一個(gè)M文件只能有一個(gè)主函數(shù),通常主函數(shù)名與M函數(shù)文件名相同。2.子函數(shù)(1)子函數(shù)的次序無(wú)任何限制;(2)子函數(shù)只能被同一文件中的函數(shù)(主函數(shù)或子函數(shù))調(diào)用,不能被其它文件的函數(shù)調(diào)用;(3)同一文件的主函數(shù)和子函數(shù)運(yùn)行時(shí)的工作空間是相互獨(dú)立的。

eg.ex5_10Matlab_程序設(shè)計(jì)和M文件5.3.2函數(shù)的輸入輸出參數(shù)Matlab函數(shù)調(diào)用過(guò)程實(shí)際上也是參數(shù)的傳遞過(guò)程.函數(shù)A調(diào)用了函數(shù)B,稱A為“主調(diào)函數(shù)”,而B(niǎo)為“被調(diào)用函數(shù)”.函數(shù)通過(guò)輸入?yún)?shù)接收數(shù)據(jù),經(jīng)函數(shù)運(yùn)算后由輸出參數(shù)輸出結(jié)果.Matlab_程序設(shè)計(jì)和M文件1.參數(shù)的傳遞函數(shù)的參數(shù)傳遞是將主調(diào)函數(shù)中的變量值傳給被調(diào)函數(shù)的輸入?yún)?shù)。(1)函數(shù)參數(shù)傳遞的是數(shù)值;(2)參數(shù)的存儲(chǔ)空間:被調(diào)函數(shù)的輸入?yún)?shù)存放在函數(shù)的工作空間中,與MATLAB的工作空間是獨(dú)立的,當(dāng)調(diào)用結(jié)束時(shí)函數(shù)的工作空間被清除,輸入?yún)?shù)就消失了。eg.ex5_10Matlab_程序設(shè)計(jì)和M文件2.輸入輸出參數(shù)的個(gè)數(shù)Matlab中調(diào)用函數(shù)時(shí)的參數(shù)個(gè)數(shù)和函數(shù)聲明時(shí)的不一定相同,可用專用函數(shù)確定實(shí)際調(diào)用時(shí)輸入輸出參數(shù)的個(gè)數(shù)。(1)nargin和nargout函數(shù)

nargin('fun')

%獲取函數(shù)fun的輸入?yún)?shù)個(gè)數(shù)

nargout('fun')

%獲取函數(shù)fun的輸出參數(shù)個(gè)數(shù)說(shuō)明:fun是函數(shù)名,當(dāng)nargin和nargout函數(shù)在函數(shù)體內(nèi)時(shí)fun可省略,在函數(shù)外時(shí)fun不省略。Matlab_程序設(shè)計(jì)和M文件補(bǔ)充:可選參數(shù)MATLAB的許多函數(shù)有可選參數(shù),它們?nèi)绾闻袛嘤玫搅四男﹨?shù)以及進(jìn)行了什么操作呢?可以用8個(gè)特殊函數(shù)來(lái)獲得可選參數(shù)的信息,及報(bào)告參數(shù)中的錯(cuò)誤.Matlab_程序設(shè)計(jì)和M文件▲nargin

該函數(shù)返回調(diào)用函數(shù)時(shí)實(shí)際用的輸入?yún)?shù)的個(gè)數(shù).▲nargout該函數(shù)返回調(diào)用函數(shù)時(shí)實(shí)際用的輸出參數(shù)的個(gè)數(shù).▲nargchk

當(dāng)調(diào)用函數(shù)時(shí)用了太少或太多輸入?yún)?shù)時(shí),該函數(shù)返回一個(gè)標(biāo)準(zhǔn)的錯(cuò)誤信息.▲error

當(dāng)參數(shù)有致命錯(cuò)誤時(shí),顯示錯(cuò)誤信息并異常中斷產(chǎn)生錯(cuò)誤的函數(shù).▲warning

當(dāng)參數(shù)無(wú)致命錯(cuò)誤時(shí),顯示警告信息且函數(shù)繼續(xù)執(zhí)行.▲inputname

該函數(shù)根據(jù)參數(shù)個(gè)數(shù)返回實(shí)際的變量名.Matlab_程序設(shè)計(jì)和M文件>>helpnargchkNARGCHKValidate(驗(yàn)證)numberofinputarguments.

MSG=NARGCHK(LOW,HIGH,N)returnsanappropriateerrormessagestringifNisnotbetweenLOWandHIGH.Ifitis,NARGCHKreturnsanemptymatrix.Example:

error(nargchk(1,3,nargin,'struct'))

Matlab_程序設(shè)計(jì)和M文件eg.使用可選參數(shù)function[mag,angle]=polar_value(x,y)%POLAR_VALUEConverts(x,y)to(r,theta)%FunctionPOLAR_VALUEconvertsaninput(x,y)%valueinto(r,theta),withthetaindegrees.%Itillustratestheuseofoptionalarguments,%Definevariables:%angle--Angleindegrees%msg--Errormessage%mag--MagnitudeMatlab_程序設(shè)計(jì)和M文件%x--Inputxvalue%y--Inputyvalue(optional)%Recordofrevisions:%DateProgrammerDescriptionofchange%12/16/98S.J..Chapmanoriginalcode%Checkforalegalnumberofinputarguments.msg=nargchk(1,2,nargin);error(msg);Matlab_程序設(shè)計(jì)和M文件%Iftheyargumentismissing,setitto0.ifnargin<2y=0;end%Checkfor(0,0)inputarguments,andprintout%awarningmessage.ifx==0&y==0msg='Bothxandyarezero:angleismeaningless!';warning(msg);endMatlab_程序設(shè)計(jì)和M文件%Nowcalculatethemagnitude.mag=sqrt(x.^2+y.^2);%Ifthesecondoutputargumentispresent,calculate%angleindegrees.ifnargout==2angle=atan(y,x)*180/pi;endMatlab_程序設(shè)計(jì)和M文件執(zhí)行函數(shù):>>[magangle]=polar_value???Errorusing==>polar-valueNotenoughinputarguments.>>[magangle]=polar_value(1,-1,1)???Errorusing==>polarvalueToomanyinputarguments.>>[magangle]=polar_value(1)mag=1angle=0Matlab_程序設(shè)計(jì)和M文件>>[magangle]=polar_value(1,-1)mag=1.4142angle=-45>>mag=polar_value(1,-1)mag=1.4142>>[magangle]=polar_value(0,0)Warning:Bothxandyarezero:angleismeaningless!Ind:\book\matlab\chap5\polar_value.matline32mag=0angle=0Matlab_程序設(shè)計(jì)和M文件(2)varargin和varargout函數(shù)用于處理復(fù)雜輸入輸出參數(shù),varargin和varargout函數(shù)需要與分支結(jié)構(gòu)結(jié)合使用,將函數(shù)調(diào)用時(shí)實(shí)際傳遞的參數(shù)構(gòu)成元胞數(shù)組,通過(guò)訪問(wèn)元胞數(shù)組中各元素內(nèi)容來(lái)獲得輸入輸出變量。格式:

functiony=fun(varargin)%輸入?yún)?shù)為varargin的函數(shù)funfunctionvarargout=fun(x)%輸出參數(shù)為varargout的函數(shù)funfunctionvarargout=fun(varargin)Matlab_程序設(shè)計(jì)和M文件5.3.3局部變量、全局變量和靜態(tài)變量變量的作用域和生存期:作用域是變量的作用范圍,生存期是變量的生存時(shí)間。根據(jù)變量作用域的不同,可將其分為局部變量和全局變量。根據(jù)變量生存期的不同,可將其分為自動(dòng)變量和靜態(tài)變量。注意:函數(shù)名與同一作用域的變量名不能重復(fù),否則函數(shù)無(wú)法被調(diào)用.Matlab_程序設(shè)計(jì)和M文件1.局部變量局部變量(LocalVariables)的作用范圍是定義該變量的函數(shù)內(nèi)部。聲明局部變量:不需要特別聲明變量的存儲(chǔ):在獨(dú)立的函數(shù)工作空間中變量結(jié)束:變量所在的函數(shù)執(zhí)行完畢時(shí)。Matlab_程序設(shè)計(jì)和M文件2.全局變量

全局變量具有全局作用域,可在不同函數(shù)和Matlab工作空間中共享。作用:減少參數(shù)傳遞過(guò)程,提高程序執(zhí)行效率。缺點(diǎn):全局變量在任何定義過(guò)的函數(shù)中都可以修改,使用時(shí)應(yīng)十分小心。Matlab_程序設(shè)計(jì)和M文件(1)聲明全局變量

全局變量在使用前必須用“global”聲明,而且每個(gè)要共享全局變量的函數(shù)和工作空間,都必須逐個(gè)用“global”對(duì)該變量加以聲明。(2)清除全局變量使用clear命令,命令格式如下:

clearglobal變量名 %清除某個(gè)全局變量

clearglobal %清除所有的全局變量

eg.li5_13Matlab_程序設(shè)計(jì)和M文件3.靜態(tài)變量格式:

persistentx;注意:它只能在function里聲明,且只有這個(gè)function才能認(rèn)識(shí)它.聲明后需初始化,注意不能直接賦值;而是先用isempty(x)判斷x是否已經(jīng)賦值,若沒(méi)有,則可以賦值給x。如:functiony=test()

persistenta;

ifisempty(a)

a=0;

end

a=a+1;

y=a;之后第一次調(diào)用y=test;結(jié)果y=1,第二次調(diào)用y=test;結(jié)果y=2。就是說(shuō)a記錄了每次調(diào)用function后的結(jié)果。如果a為自動(dòng)變量,則每次調(diào)用y=test后結(jié)果都是1.Matlab_程序設(shè)計(jì)和M文件5.3.4嵌套函數(shù)、私有函數(shù)和重載函數(shù)1.嵌套函數(shù)在MATLAB中一個(gè)函數(shù)的內(nèi)部還可以定義一個(gè)或多個(gè)函數(shù),這種定義在其他函數(shù)內(nèi)部的函數(shù)就稱為嵌套函數(shù)。此時(shí),每個(gè)函數(shù)必須用end結(jié)束。調(diào)用原則:

(1)外層函數(shù)可以調(diào)用內(nèi)一層函數(shù),但不能隔層調(diào)用;

(2)同層嵌套函數(shù)可以互相調(diào)用

(3)內(nèi)層函數(shù)可以調(diào)用外一層函數(shù)及和外層函數(shù)同層的其他函數(shù)。Matlab_程序設(shè)計(jì)和M文件functionA(x)functionB(x,y)functionC(z)endendfunctionD(x)functionE(z,y)endendendA可以調(diào)用:B,DB可以調(diào)用:C,D,AC可以調(diào)用:B,D,ED可以調(diào)用:E,B,AE可以調(diào)用:D,B,CMatlab_程序設(shè)計(jì)和M文件2.私有函數(shù)私有函數(shù)是限制訪問(wèn)權(quán)限的函數(shù),私有函數(shù)存放在“private”子目錄中,只能被其直接父目錄的M函數(shù)文件所調(diào)用。3.重載函數(shù)重載函數(shù)是指兩個(gè)函數(shù)使用相同的名稱,處理的功能相似,但參數(shù)類型或個(gè)數(shù)不同,重載函數(shù)通常放在不同的文件夾下,文件夾名稱以“@”開(kāi)頭后面跟一個(gè)數(shù)據(jù)類型名。Matlab_程序設(shè)計(jì)和M文件5.3.5函數(shù)的工作過(guò)程和P碼文件1.函數(shù)的搜索過(guò)程當(dāng)在MATLAB中輸入一個(gè)標(biāo)識(shí)符時(shí),首先確認(rèn)是不是變量名,若不是,則做如下搜索:檢查是否是本M函數(shù)文件內(nèi)部的子函數(shù);檢查是否是“private”目錄下的私有函數(shù);檢查是否在當(dāng)前路徑中;檢查是否在搜索路徑中。Matlab_程序設(shè)計(jì)和M文件2.P碼文件P碼就是偽代碼(Pseudocode),一個(gè)M文件第一次被調(diào)用時(shí),MATLAB就將其進(jìn)行編譯并生成P碼文件存放在內(nèi)存中,生成的P碼文件與原M文件名相同,其擴(kuò)展名為“.p”,P碼文件的保密性好。pcode......-inplace %生成……文件Matlab_程序設(shè)計(jì)和M文件3.函數(shù)的工作空間每一個(gè)M函數(shù)運(yùn)行時(shí)都有一個(gè)內(nèi)存區(qū),稱為函數(shù)的工作空間。清除函數(shù)的工作空間:

clearfunctions

%清除所有編譯過(guò)的M函數(shù)文件和MEX文件工作空間

clearfunctionfunname%清除某個(gè)編譯過(guò)的函數(shù)工作空間Matlab_程序設(shè)計(jì)和M文件5.4程序的調(diào)試

5.4.1直接檢測(cè)(1)對(duì)于需要檢測(cè)的變量可以通過(guò)刪除語(yǔ)句行末尾的分號(hào),或在程序的適當(dāng)位置加顯示變量值的語(yǔ)句,將結(jié)果顯示在命令窗口中;(2)以腳本文件的方式來(lái)執(zhí)行該函數(shù)。調(diào)試函數(shù)時(shí),可以將該函數(shù)的第一句函數(shù)聲明行前加“%”,并給輸入?yún)?shù)賦值;(3)在程序的適當(dāng)位置添加“keyboard”語(yǔ)句,當(dāng)程序運(yùn)行至此句會(huì)暫停運(yùn)行,并在命令窗口顯示“k>>”提示符,這時(shí)就可以在命令窗口查看和修改各變量的內(nèi)容。Matlab_程序設(shè)計(jì)和M文件5.4.2M文件編輯/調(diào)試器窗口1.“Debug”菜單(1)Step(F10)(2)Stepin(F11)和Stepout(shift+F11)(3)Run/Continue(F5)(4)Set/ClearBreakpoints(F12)(5)Set/ModifyConditionalBreakpoint…(6)StopifErrors/Warnings…(7)ExitDebugModeMatlab_程序設(shè)計(jì)和M文件5.5匿名函數(shù)、inline對(duì)象和函數(shù)句柄

5.5.1匿名函數(shù)匿名函數(shù)是面向命令行代碼的函數(shù)形式,通常只有一句很簡(jiǎn)單的語(yǔ)句。fhandle=@(arg1,arg2,......)(expr)

%創(chuàng)建匿名函數(shù)說(shuō)明:fhandle是函數(shù)句柄;arg1,arg2,......是參數(shù)列表,也可以省略;expr是函數(shù)表達(dá)式。例:5-16>>fhnd1=@(x)(1+exp(-x)); %創(chuàng)建匿名函數(shù)>>rf1=fhnd1(2) %調(diào)用匿名函數(shù)rf1=1.1353Matlab_程序設(shè)計(jì)和M文件5.5.2inline對(duì)象創(chuàng)建inline對(duì)象就是使用inline函數(shù)將字符串轉(zhuǎn)換成inline對(duì)象。inline_fun=inline(‘string’,arg1,arg2,…)

%創(chuàng)建inline對(duì)象例:5-17>>f=inline('sin(x)*exp(-z*x)','x','z') %創(chuàng)建inline對(duì)象f>>class(f) %查看f的類型ans=inline>>y1=f(1,2) %調(diào)用inline對(duì)象fy1=0.1139>>y2=feval(f,1,2)y2=0.1139Matlab_程序設(shè)計(jì)和M文件5.5.3函數(shù)句柄函數(shù)句柄(Function_Handle)包含了函數(shù)的路徑、函數(shù)名、類型以及可能存在的重載方法,即函數(shù)是否為內(nèi)部函數(shù)、M或P文件、子函數(shù)、私有函數(shù)等。1.創(chuàng)建函數(shù)句柄fhandle=@fun %創(chuàng)建函數(shù)句柄2.函數(shù)句柄的調(diào)用[y1,y2,…]=fhandle(arg1,arg2…)%調(diào)用函數(shù)句柄fhandle[y1,y2,…]=feval(fhandle,arg1,arg2…)[y1,y2,…]=feval('fun',arg1,arg2…)Matlab_程序設(shè)計(jì)和M文件5.6函數(shù)繪圖

5.6.1fplot命令fplot命令可以繪制函數(shù)的曲線。fplot(fun,limits,tol,Linespec)

%繪制函數(shù)fun的曲線fplot(fun,limits,n)

說(shuō)明:fun是函數(shù)句柄或函數(shù)名;limits是自變量的取值范圍[xminxmax]或[xminxmaxyminymax];tol是相對(duì)誤差度,默認(rèn)為2e-3,可省略;Linespec是線型,與plot命令的設(shè)置相同,可省略;n是繪制的點(diǎn)數(shù),當(dāng)n≥1時(shí)至少繪制n+1個(gè)點(diǎn)。例:>>fhnd=@(x)(exp(-x).*sin(x));>>fplot(fhnd,[020],'b-.*')Matlab_程序設(shè)計(jì)和M文件5.6.2ezplot命令ezplot命令也是用于繪制函數(shù)在某一自變量區(qū)域內(nèi)的圖形,ezplot命令格式如下:ezplot(fun,[min,max])

%繪制函數(shù)fun的曲線ezplot(x,y,[tmin,tmax])

說(shuō)明:fun是函數(shù)句柄或函數(shù)名;[min,max]是自變量的范圍,可省略,省略時(shí)默認(rèn)為[-2*pi,2*pi],當(dāng)fun是二元函數(shù),則范圍是[xminxmaxyminymax];x和y是指x(t)和y(t);[tmin,tmax]是t的范圍,可省略,省略時(shí)范圍是[0,2*pi]。例:>>ezplot('x^2+y^2-1',[-3,3,-3,3])Matlab_程序設(shè)計(jì)和M文件5.7數(shù)值分析

5.7.1求最小值和過(guò)零點(diǎn)1.一元函數(shù)的最小值fminbnd函數(shù)可以獲得一元函數(shù)在給定區(qū)間內(nèi)的最小值。x=fminbnd(fun,x1,x2)%尋找最小值2.多元函數(shù)的最小值fminsearch函數(shù)可以獲得多元函數(shù)的最小值。[x,fval]=fminsearch(fun,x0) %尋找最小值3.一元函數(shù)的過(guò)零點(diǎn)x=fzero(fun,

溫馨提示

  • 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)論