山大MATLAB編程指導(dǎo)課件第6章 M文件和函數(shù)句柄_第1頁
山大MATLAB編程指導(dǎo)課件第6章 M文件和函數(shù)句柄_第2頁
山大MATLAB編程指導(dǎo)課件第6章 M文件和函數(shù)句柄_第3頁
山大MATLAB編程指導(dǎo)課件第6章 M文件和函數(shù)句柄_第4頁
山大MATLAB編程指導(dǎo)課件第6章 M文件和函數(shù)句柄_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第6章 M文件和函數(shù)句柄 matlab語言稱為第四代編程語言,程序簡潔、可讀性很強(qiáng)而且調(diào)試十分容易。 進(jìn)行程序設(shè)計(jì)的m文件是matlab重要組成部分。 本章內(nèi)容 1 matlab控制流 2 腳本文件和函數(shù)文件 3 函數(shù)類別 4 函數(shù)句柄6.1 MATLAB控制流 (1) 順序結(jié)構(gòu) 依次順序執(zhí)行程序的各條語句(2) 分支結(jié)構(gòu)根據(jù)一定條件來執(zhí)行各條語句。 if else end條件控制語句有3種形式 單分支 、雙分支、多分支 switch case otherwise end結(jié)構(gòu) 僅執(zhí)行滿足條件的分支 (3) 循環(huán)結(jié)構(gòu) 被重復(fù)執(zhí)行的一組語句。 循環(huán)語句主要有: for end while end分

2、支控制有3種形式多分支 if 表達(dá)式1 語句1 elseif 表達(dá)式2 語句2 elseif 表達(dá)式3 語句3 else 語句n end6.1 MATLAB控制流 6.1.1 if else end條件控制 單分支 if 表達(dá)式 執(zhí)行語句 end 雙分支 if 表達(dá)式 語句1 else 語句2 end 在條件表達(dá)式中,通常用 關(guān)系操作符: , ,=, = =, = 邏輯操作符: &,| , 邏輯函數(shù):isequal 若是相等則為真 isempty 若是空矩陣則為真 isstr 若是字符串則為真function y=abc(x)% function calculate of yn=length(

3、x);for k=1:n if x(k)=1 y(k)=exp(1-x(k); else y(k)=x(k)3; endend例6.1-1:編寫m函數(shù),對于任意一組輸入x值,計(jì)算函數(shù)值 x (x-1)y = x3 (-1xS,N=exm060104(0.0001) S = 1.9859, N = 141function S,N=exm060104(epsilon)k=0;s=0;d=inf;S=0;while depsilon k=k+1; s=s+k; %sum(1:k) d=1/s; S=S+d;endN=k;符號法驗(yàn)證結(jié)果:N=141;SN=vpa(symsum(1/symsum(k,1

4、,n),n,1,N) %N項(xiàng)(141項(xiàng))和 SN=1.9859154929577464788732394366197syms k n NSINF=limit(symsum(1/symsum(k,1,n),n,1,N),N,inf) SINF=2【例6.1-5】創(chuàng)建n階魔方矩陣,限定條件是n為能被4整除的偶數(shù)。(1)所謂魔方矩陣(Magic matrix),是指那矩陣由1到n2的正整數(shù)按照一定規(guī)則排列而成,并且每列、每行、每條對角線元素的和都等于n(n2+1)/2 。就生成規(guī)則而言,魔方矩陣可分成三類:一,n為奇數(shù);二,n為不能被4整除的偶數(shù);三,n為能被4整除的偶數(shù)。clear;clc;whi

5、le 1n=input(請輸入一個(gè)能被4整除的正整數(shù)! n = ); if mod(n,4)=0 break endendG=logical(eye(4,4)+rot90(eye(4,4); m=n/4;K=repmat(G,m,m); N=n2;A=reshape(1:N,n,n); A(K)=N-A(K)+1s0=round(n*(n*n+1)/2);disp(int2str(n), 階魔方矩陣的標(biāo)稱和是 ,int2str(s0)Ns0=round(2*(n+1);B=A;SC=sum(A); SR=sum(B);Sd=sum(diag(A); Sdi=sum(diag(B); LS=SC

6、,SR,Sd,Sdi=s0;NS=round(sum(LS);if NS=Ns0disp(經(jīng)驗(yàn)證,A是魔方矩陣。)elsedisp(經(jīng)驗(yàn)證,A不是魔方矩陣。)end 12 階魔方矩陣的標(biāo)稱和是 870經(jīng)驗(yàn)證,A是魔方矩陣。 6.1.3 控制程序流的其他常用指令見表6.1-4inputkeyboardbreakcontinuepause(n)return控制程序程序流的其他常用指令1) v=input(msg) v=input(msg, s )該指令執(zhí)行時(shí),控制權(quán)交給鍵盤,待輸入結(jié)束,按Enter鍵,控制權(quán)交換matlab, msg是提示用的字符串,告訴用戶輸入什么.第一種格式用于鍵入數(shù)值,字符

7、串等數(shù)據(jù),最后v是一個(gè)數(shù)值(包括數(shù)組)或者一個(gè)字符串第二種格式,不管鍵入什么,總以字符串形式賦給變量v。2) keyboard從M文件中激活鍵盤,遇到該命令時(shí),將控制權(quán)交給鍵盤,用戶可以從鍵盤輸入各種matlab指令,僅當(dāng)用戶輸入return指令后,控制權(quán)才交還給程序。與input指令的區(qū)別是:該指令允許輸入任意多個(gè)matlab指令, 而input只能輸入賦給變量的值。該指令在調(diào)試M文件時(shí)非常有用。3) continue跳過位于其后的循環(huán)中的其他指令,執(zhí)行循環(huán)的下一個(gè)迭代例 更改數(shù)組中的值a=ones(1,12);count=0;s=0;for k=1:12 if rem(k,3)=0 con

8、tinue else s=s+k; end count = count + 1; endcount = 8break4) break終止while,for循環(huán),也可以在if-end, switch-case, try-catch中導(dǎo)致中斷5) pause, pause(n)第一種格式使程序暫停執(zhí)行,等待用戶按任意鍵繼續(xù),第二種格式使程序暫停n秒后,再繼續(xù)執(zhí)行6) return結(jié)束return指令所在函數(shù)的執(zhí)行,把控制轉(zhuǎn)至主調(diào)函數(shù)或指令窗.否則,只有整個(gè)被調(diào)函數(shù)執(zhí)行完畢才轉(zhuǎn)出6.2 腳本文件 和函數(shù)文件腳本文件 簡單的m文件腳本文件實(shí)際上是一串指令的集合,與在命令窗口逐行執(zhí)行文件中的所有指令,其

9、結(jié)果是一樣的。沒有輸入輸出參數(shù)。運(yùn)行產(chǎn)生的所有變量駐留在基本工作空間。6.2.1 腳本文件m文件的語法類似于c語言,但又有其自身特點(diǎn)。它只是一個(gè)簡單的ASCII碼文本文件,執(zhí)行程序時(shí)逐行解釋運(yùn)行程序。 m文件有兩類獨(dú)立的m文件 稱腳本文件 可調(diào)用m文件 稱函數(shù)文件6.2.2 M函數(shù)文件 需要輸入變量,返回輸出變量函數(shù)m文件的格式: function 返回變量=函數(shù)名(輸入變量) %注釋說明語句段 程序語句段特定規(guī)則:函數(shù)m文件第一行必須以單詞function作為引導(dǎo)詞,必須遵循如下形式: function =()m文件的文件名最好是 .m。程序中的變量均為局部變量,不保存在工作空間中。 其變量

10、只在函數(shù)運(yùn)行期間有效。6.2.3 局部變量和全局變量局部(local)變量它存在于函數(shù)空間內(nèi)部的中間變量,產(chǎn)生于該函數(shù)的運(yùn)行過程中,其影響范圍也僅限于該函數(shù)本身。全局(global)變量通過global指令定義變量,Matlab也允許幾個(gè)不同的函數(shù)空間以及基本工作空間共享同一個(gè)變量。這種被共享的變量稱為全局變量。每個(gè)希望共享全局變量的函數(shù)或Matlab基本工作空間,必須逐個(gè)用 global對具體變量加以專門定義。沒有采用global定義的函數(shù)或基本工作空間,將無權(quán)享用全局變量。 關(guān)于全局變量的說明如果某個(gè)函數(shù)的運(yùn)作使全局變量的內(nèi)容發(fā)生了變化,那么其他函數(shù)空間以及基本工作空間中的同名變量也就隨之

11、變化。除非與全局變量聯(lián)系的所有工作空間都被刪除,否則全局變量依然存在。對全局變量的定義必須在該變量被使用之前進(jìn)行。建議把全局變量的定義放在函數(shù)體的首行位置。雖然Matlab對全局變量的名字沒有任何特別的限制,但是為了提高 M文件的可讀性,建議選用大寫字符命名全局變量。由于全局變量損害函數(shù)的封裝性,因此不提倡使用全局變量。 6.2.4函數(shù)文件一般結(jié)構(gòu): 舉例vdp1,ode451.函數(shù)申明行 :位于函數(shù)文件的首行,以關(guān)鍵字 function開頭,函數(shù)名以及函數(shù)的輸入輸出參量都在這一行定義。函數(shù)名和文件名必須相同。2.H1行:緊隨函數(shù)申明行之后以 %開頭的第一行注釋行,包括大寫體的函數(shù)文件名;運(yùn)用

12、關(guān)鍵詞要描述的函數(shù)功能。3.在線幫助文件文本 :H1行及其之后的連續(xù) %開頭的所有注釋行構(gòu)成整個(gè)在線幫助文本。它通常包括:函數(shù)輸入輸出參量的含義,調(diào)用格式說明。6.2.4函數(shù)文件一般結(jié)構(gòu)4.編寫和修改記錄:與在線幫助文本區(qū)相隔一個(gè)“空”行,也以%開頭。標(biāo)志編寫及修改該文件的作者、日期和版本記錄。它用于軟件檔案管理。5.函數(shù)體:這部分內(nèi)容由實(shí)現(xiàn)該 M函數(shù)文件功能的Matlab指令組成。它接收輸入?yún)⒘?,進(jìn)行程序流控制,得到輸出參量。例6.2-1:根據(jù)指定邊數(shù)N、半徑、線型色彩,繪出圓周線(正多邊形)或填色圓 (正多邊形) 。function S,L=exm060201(N,R,str)switch

13、 nargin case 0, N=100;R=1;str=-b; case 1, R=1;str=-b; case 2, str=-b; case 3 ; otherwise, error(輸入量太多);end;t=0:2*pi/N:2*pi;x=R*sin(t);y=R*cos(t);if nargout=0,plot(x,y,str)elseif nargout2,error(輸出量太多);else S=N*R*R*sin(2*pi/N) /2; L=2*N*R*sin(pi/N); fill(x,y,str)endaxis equal square,box on,shg %將該函數(shù)M文

14、件存于matlab搜索路徑上調(diào)用:S,L=exm060201(6,2,-g)function grade=score2grade(score);% TRANS 將學(xué)生分?jǐn)?shù) score 轉(zhuǎn)換為五級制成績grade% 級別,90-100, A; 80-89, B; 70-79,C; 60-69,D; others, E;for i=1:10 ai=89+i; bi=79+i; ci=69+i; di=59+i; endfor k=1:length(score) switch score(k) case 100, gradek= A; case a, gradek= A ; case b, grad

15、ek= B; case c, gradek= C; case d, gradek= D; otherwise, gradek= E; endend例6.1-2存為M函數(shù)文件, 百分成績轉(zhuǎn)換為五級制成績。(1)主函數(shù):由第一個(gè)function引出的函數(shù)(2)子函數(shù):由非第一個(gè)function引出的,寄生在主函數(shù)體內(nèi)的函數(shù) 各函數(shù)間通過輸入輸出宗量或全局變量傳遞(3)匿名函數(shù):不以文件形式駐留在文件夾中 創(chuàng)建:FH=(arglis)expr 直接調(diào)用:FH(arglis) 用函數(shù)句柄演算函數(shù)間接調(diào)用:feval(FH,arglis)6.3 MATLAB 的函數(shù)類別例:匿名函數(shù)的調(diào)用 y=(x)(x

16、.2+x-20) feval(y,2) 或 y(2)6.3.1 主函數(shù) 通常每個(gè) M 文件中的第一個(gè)函數(shù)為主函數(shù),主函數(shù)可以被該文件之外的其他函數(shù)調(diào)用,而子函數(shù)只能被該文件內(nèi)的函數(shù)調(diào)用。主函數(shù)的調(diào)用通過存儲該函數(shù)的 M 文件的文件名調(diào)用。我們在前面幾節(jié)中編寫的實(shí)驗(yàn)程序,大多為主函數(shù)。因此,這里不再過多介紹。6.3 MATLAB 的函數(shù)類別6.3.2 子函數(shù) 一個(gè) M 文件中可以包括多個(gè)函數(shù),除主函數(shù)之外的其他函數(shù)稱為子函數(shù)。子函數(shù)只能被主函數(shù)或該文件內(nèi)的其他子函數(shù)調(diào)用。每個(gè)子函數(shù)以函數(shù)定義語句開頭,直至下一個(gè)函數(shù)的定義或文件的結(jié)尾。當(dāng)函數(shù)中調(diào)用函數(shù)時(shí),系統(tǒng)判斷其函數(shù)類型的順序?yàn)椋菏紫扰袛嗍欠駷?/p>

17、子函數(shù),然后判斷是否為私有函數(shù),最后判斷其是否為當(dāng)前目錄下的 M 文件函數(shù)或者系統(tǒng)內(nèi)置函數(shù)。由于子函數(shù)具有最高的優(yōu)先級別,因此,在定義子函數(shù)時(shí),可以采用已有的其他外部函數(shù)的名稱。 子函數(shù)每個(gè)子函數(shù)的第一行是其自己的函數(shù)申明行;主函數(shù)的位置不可改變,但子函數(shù)的排列次序可以任意改變;子函數(shù)只能被處于同一文件的主函數(shù)或其他子函數(shù)調(diào)用;在M函數(shù)文件中,任何指令通過“名字”對函數(shù)進(jìn)行調(diào)用時(shí),子函數(shù)的優(yōu)先級僅次于內(nèi)裝函數(shù)。同一文件的主函數(shù)、子函數(shù)的工作空間都是彼此獨(dú)立的。各函數(shù)間的信息,或通過輸入輸出宗量傳遞,或通過全局變量傳遞,或通過跨空間指令傳遞。help,lookfor等幫助指令都不提供關(guān)于子函數(shù)的

18、任何幫助信息。 第四章習(xí)題六用主、子函數(shù)實(shí)現(xiàn)function y0_5=main( )tspan=0, 0.5; y0=1;0; tt,yy=ode45(DyDt,tspan,y0); y0_5=yy(end,1); function ydot=DyDt (t,y)mu=3;ydot=y(2);mu*y(2)-2*y(1)+1;在命令行輸入y0_5=main,即可得到結(jié)果例6.3-1: 編寫一個(gè)內(nèi)含子函數(shù)的函數(shù)M文件function Hr=exm060301(flag)%prime functiont=(0:50)/50*2*pi;x=sin(t);y=cos(t);Hr=cirline;fe

19、val(Hr,flag,x,y,t)%subfunctionfunction cirline(wd,x,y,t)switch wd case line plot(t,x,b,t,y,r); case circle plot(x,y,-g) otherwise error(輸入宗量錯(cuò)!)endaxis square%主調(diào)函數(shù)exm060301(line)HH=exm060301(circle) %繪圖并返回子函數(shù)句柄t=(0:2*pi/5:2*pi);x=cos(t);y=sin(t);HH(circle,x,y,t) %通過子函數(shù)句柄直接調(diào)用子函數(shù)匿名函數(shù)提供了一種創(chuàng)建簡單程序的方法,使用它用

20、戶可以不必每次都編寫 M 文件。用戶可以在 MATLAB 的命令窗口或是其他任意 M 文件和腳本文件中使用匿名函數(shù)。匿名函數(shù)的創(chuàng)建格式為: FH = (arglist) expr 其中 FH 是為該函數(shù)創(chuàng)建的函數(shù)句柄; 符號用于創(chuàng)建函數(shù)句柄;arglist 為用逗號分隔的參數(shù)列表;expr 為函數(shù)主體,為 MATLAB 表達(dá)式。匿名函數(shù)的調(diào)用格式為: FH (arglist) %直接調(diào)用 feval(FH, arglist) %間接調(diào)用6.3.3 匿名函數(shù)嵌套函數(shù) 一個(gè)函數(shù)內(nèi)部可以定義其他的函數(shù),這種內(nèi)部的函數(shù)稱作嵌套函數(shù)。1嵌套函數(shù)的書寫定義嵌套函數(shù)時(shí),只要在一個(gè)函數(shù)內(nèi)部直接定義嵌套函數(shù)即可

21、。需要注意的是當(dāng)一個(gè) M文件中存在嵌套函數(shù)時(shí),該文件內(nèi)的所有函數(shù)必須以 end 結(jié)尾。私用函數(shù)的構(gòu)造與普通 M函數(shù)完全相同;私用函數(shù)只能被 private目錄的直接父目錄上的 M函數(shù)文件所調(diào)用。它不能被其他目錄上的任何M函數(shù)、M腳本文件或 Matlab指令窗中的命令所調(diào)用,也不能被直接父目錄上的 M腳本文件調(diào)用。M文件中,任何指令通過“名字”對函數(shù)進(jìn)行調(diào)用時(shí),私用函數(shù)的優(yōu)先級雖低于內(nèi)裝函數(shù)和子函數(shù),但高于其他任何目錄上的函數(shù)help, lookfor等指令都不能提供關(guān)于私用函數(shù)的任何幫助信息。私用函數(shù) 串演算函數(shù)一種是串演算函數(shù)eval,它具有對字符串表達(dá)式進(jìn)行計(jì)算的能力;另一種是“函數(shù)句柄演

22、算函數(shù)”feval,它具有對函數(shù)句柄進(jìn)行操作的能力。y=eval(CEM) 執(zhí)行CEM指定的計(jì)算y1,y2,=eval(CEM) 執(zhí)行CEM代表的函數(shù)文件,并輸出結(jié)果 eval指令的輸入?yún)⒘勘仨毷亲址?;?gòu)成字符串CEM,可以是Matlab任何合法的指令、表達(dá)式、語句或M文件名;第二種格式中的CEM只能是(包含輸入?yún)⒘吭趦?nèi)的)M函數(shù)文件名; 6.4 函數(shù)句柄函數(shù)句柄是matlab的一種數(shù)據(jù)類型,攜帶著“相應(yīng)函數(shù)創(chuàng)建句柄時(shí)的路徑、視野(Scope)、函數(shù)名及重載方法”。 優(yōu)點(diǎn):使函數(shù)調(diào)用像變量一樣靈活方便拓寬子函數(shù)包括局部函數(shù)的使用范圍提高函數(shù)調(diào)用的可靠性和軟件的重用性減少程序設(shè)計(jì)中的冗余提高重

23、復(fù)執(zhí)行的效率6.4.1 函數(shù)句柄的創(chuàng)建和觀察函數(shù)句柄的定義有兩種:(1)在提示符 后添加相應(yīng)函數(shù)的函數(shù)名;(2)利用轉(zhuǎn)換函數(shù)str2func。 f_h=plot %與f_h=str2func(plot)等價(jià) 則: f_h = plot 函數(shù)句柄內(nèi)涵的觀察通過functions實(shí)現(xiàn) functions(f_h)ans = function: plot type: simple file: MATLAB built-in function 6.4.1 函數(shù)句柄的創(chuàng)建和觀察6.4.2函數(shù)句柄的基本用法如果一個(gè)函數(shù)的調(diào)用格式為:argout1,argout2,argoutn=FunName(argin

24、1,argin2,arginn)假設(shè)該函數(shù)的句柄為,那么通過函數(shù)句柄實(shí)現(xiàn)函數(shù)運(yùn)算的調(diào)用格式為: (1) 直接調(diào)用格式argout1,argout2,argoutn=hfun(argin1,argin2,.,arginn) (2) 間接調(diào)用格式argout1,argout2,argoutn=feval(hfun,argin1,argin2,.,arginn)6.4.2 函數(shù)句柄的調(diào)用 (1) 直接調(diào)用 例: f_h1=peaks %f_h1=str2func(peaks) f_h1(50) (2) 間接調(diào)用: feval(函數(shù)句柄,參數(shù)列表) 例: f_h=plot %f_h=str2func(plot) feval(f_h,0:10,0:10)例6.2-1:根據(jù)指定不同的半徑、色彩、線

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論