第四章的程序設(shè)計(jì)和調(diào)試_第1頁(yè)
第四章的程序設(shè)計(jì)和調(diào)試_第2頁(yè)
第四章的程序設(shè)計(jì)和調(diào)試_第3頁(yè)
第四章的程序設(shè)計(jì)和調(diào)試_第4頁(yè)
第四章的程序設(shè)計(jì)和調(diào)試_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第四章的程序設(shè)計(jì)和調(diào)試第1頁(yè),共62頁(yè),2023年,2月20日,星期三4.3腳本文件和函數(shù)文件4.3.1M腳本文件(一)腳本文件的特點(diǎn):它只是一串按用戶意圖排列而成的(包括控制流向指令在內(nèi)的)MATLAB指令集合腳本文件運(yùn)行后,所產(chǎn)生的所有變量都駐留在MATLAB基本工作空間(BaseWorkspace)中。只要用戶不使用clear指令加以清除,且MATLAB指令窗不關(guān)閉,這些變量將一直保存在基本工作空間中。基本空間將隨MATLAB的啟動(dòng)而產(chǎn)生;只有關(guān)閉MATLAB時(shí),該基本工作空間才被刪除。第2頁(yè),共62頁(yè),2023年,2月20日,星期三(二)M腳本文件的編寫和運(yùn)行(1)編寫M腳本文件的步驟點(diǎn)擊MATLAB指令窗工具條上的NewFile圖標(biāo),就可打開MATLAB文件編輯調(diào)試器MATLABEditor/Debugger,其窗口名為untitled,用戶即可在空白窗口中編寫程序。編輯完程序,點(diǎn)擊編輯調(diào)試器工具條上的保存圖標(biāo),在彈出的Windows標(biāo)準(zhǔn)風(fēng)格的“保存為”對(duì)話框中,選擇保存文件夾,鍵入新編文件的文件名,點(diǎn)【保存】鍵,就完成了文件的保存。(2)運(yùn)行文件使剛剛保存的文件所在的目錄成為當(dāng)前目錄,或讓該目錄處在MATLAB的搜索路徑上。直接在命令窗口鍵入運(yùn)行文件的文件名或在編輯器窗口中直接點(diǎn)擊工具條上的運(yùn)行按鈕都可運(yùn)行該M文件。第3頁(yè),共62頁(yè),2023年,2月20日,星期三4.3.2M函數(shù)文件(一)M函數(shù)文件的特點(diǎn)從形式上看,與腳本文件不同,函數(shù)文件的第一行總是一“function”引導(dǎo)的“函數(shù)申明行(FunctionDeclarationline)”。該行還羅列出函數(shù)與外界的聯(lián)系的全部“標(biāo)稱”輸入輸出宗量。但對(duì)“輸入輸出宗量”的標(biāo)稱數(shù)目并沒有限制,既可以完全沒有輸入輸出宗量,也可以時(shí)任意數(shù)目。MATLAB允許使用比“標(biāo)稱數(shù)目”較少的輸入輸出宗量,實(shí)現(xiàn)對(duì)函數(shù)的調(diào)用。第4頁(yè),共62頁(yè),2023年,2月20日,星期三從運(yùn)行上看,與腳本文件不同,每當(dāng)函數(shù)文件運(yùn)行,MATLAB就會(huì)專門為它開辟一個(gè)臨時(shí)工作空間(Contextworkspace)。該空間稱之為函數(shù)工作空間(Functionworkspace)。所有中間變量都存放在函數(shù)工作空間中。當(dāng)執(zhí)行完文件最后一條指令時(shí),或遇到return指令,就結(jié)束該函數(shù)文件的運(yùn)行,同時(shí)該臨時(shí)函數(shù)空間及其所有的中間變量就立即被清除。函數(shù)空間隨具體M函數(shù)文件的被調(diào)用而產(chǎn)生,隨調(diào)用的結(jié)束而刪除。函數(shù)空間是相對(duì)基本空間獨(dú)立的、臨時(shí)的。在MATLAB整個(gè)運(yùn)行期間,可以產(chǎn)生任意多個(gè)臨時(shí)函數(shù)空間。假如在函數(shù)文件中,發(fā)生對(duì)某腳本文件的調(diào)用,那么該腳本文件運(yùn)行產(chǎn)生的所有變量都存放于那函數(shù)空間之中,而不是存放在基本空間。第5頁(yè),共62頁(yè),2023年,2月20日,星期三4.3.3局部變量和全局變量(1)局部(Local)變量存在于函數(shù)空間內(nèi)部的中間變量,產(chǎn)生于該函數(shù)的運(yùn)行過程中,其影響范圍僅限于該函數(shù)本身。(2)全局(Global)變量通過global指令,MATLAB也允許幾個(gè)不同的函數(shù)空間以及基本工作空間共享同一個(gè)變量。這種被共享的變量稱為全局變量。每個(gè)希望共享全局變量的函數(shù)或MATLAB基本工作空間,必須逐個(gè)用global對(duì)其具體變量加以專門定義。沒采用global定義的函數(shù)或基本工作空間,將無權(quán)享用全局變量。第6頁(yè),共62頁(yè),2023年,2月20日,星期三補(bǔ)充說明:如果某個(gè)函數(shù)的運(yùn)作使全局變量的內(nèi)容發(fā)生了變化,那么其它函數(shù)空間以及基本工作空間中的同名變量也隨之變化。除非與全局變量聯(lián)系的所有工作空間都被刪除,否則全局變量依然存在。對(duì)全局變量的定義必須在該變量被使用之前進(jìn)行。建議把全局變量的定義放在函數(shù)體的首行位置。雖然MATLAB對(duì)全局變量的名字并沒有任何特別的限制,但是為了提高M(jìn)文件的可讀性,建議使用大寫字符命名全局變量。第7頁(yè),共62頁(yè),2023年,2月20日,星期三4.3.4M文件的一般結(jié)構(gòu)典型M函數(shù)文件的結(jié)構(gòu)如下:函數(shù)申明行(Functiondeclarationline):位于函數(shù)文件的首行,以MATLAB關(guān)鍵字function開頭,函數(shù)名以及函數(shù)的輸入輸出宗量都在這一行被定義。H1行(Thefirsthelptextline);緊隨函數(shù)聲明行之后以%號(hào)開頭的第一注釋行。按MATLAB自身文件的規(guī)則,H1行包含:大寫字體的函數(shù)文件名和運(yùn)用關(guān)鍵詞簡(jiǎn)要描述的函數(shù)功能。該H1行供lookfor關(guān)鍵詞查詢和help在線幫助使用第8頁(yè),共62頁(yè),2023年,2月20日,星期三在線幫助文本(Helptext)區(qū):H1行及其之后的連續(xù)的以%開頭的所有注釋行構(gòu)成整個(gè)在線幫助文本。它通常包括:函數(shù)輸入輸出宗量的含義;調(diào)用格式說明。編寫和修改記錄:它與在線幫助文本區(qū)相隔一個(gè)“空”行;也以%開頭;標(biāo)志編寫及修改M文件的作者和日期;版本記錄。它用作軟件檔案管理。函數(shù)體(Functionbody):為清晰起見,它與前面的注釋以“空”行相隔。這部分內(nèi)容由實(shí)現(xiàn)M函數(shù)功能的MATLAB指令組成。它接收輸入宗量,進(jìn)行程序流控制,得到輸出宗量。其中為閱讀、理解方便,也配置適當(dāng)?shù)目招泻妥⑨尅H魞H從運(yùn)算的角度看,唯“函數(shù)申明行”和“函數(shù)體”兩部分是構(gòu)成M函數(shù)文件所必不可少的。第9頁(yè),共62頁(yè),2023年,2月20日,星期三4.3.6子函數(shù)和私用函數(shù)1.子函數(shù)

MATLAB允許一個(gè)M函數(shù)文件包含多個(gè)函數(shù)的代碼。其中第一個(gè)出現(xiàn)的那個(gè)函數(shù)稱為主函數(shù)(Primaryfunction),該文件中的其他函數(shù)則稱為子函數(shù)(Subfunction)。保存時(shí)所用函數(shù)名與主函數(shù)定義名相同。外部程序只能對(duì)主函數(shù)進(jìn)行調(diào)用。第10頁(yè),共62頁(yè),2023年,2月20日,星期三子函數(shù)的性質(zhì):每個(gè)子函數(shù)的第1行是其自己的函數(shù)申明行。在M函數(shù)文件內(nèi),主函數(shù)的位置不可改變,但子函數(shù)的排列次序可以任意改變。子函數(shù)智能被處于同一文件的主函數(shù)或其它其函數(shù)調(diào)用。在M函數(shù)文件中,任何指令通過“名字”對(duì)函數(shù)進(jìn)行調(diào)用時(shí),子函數(shù)的優(yōu)先級(jí)僅次于內(nèi)裝函數(shù)。同一文件的主函數(shù)、子函數(shù)的工作空間都是彼此獨(dú)立的。各函數(shù)間的信息,或通過輸入輸出變量傳遞,或通過全局變量傳遞,或通過跨空間指令傳遞。help,lookfor等幫助指令都不能提供關(guān)于子函數(shù)的任何幫助信息。第11頁(yè),共62頁(yè),2023年,2月20日,星期三2.私用函數(shù)所謂私用函數(shù),是指位于private目錄上的M文件函數(shù)。它有如下性質(zhì):私用函數(shù)的構(gòu)造與普通M函數(shù)完全相同。私用函數(shù)只能被private直接父目錄上的M文件所調(diào)用,而不能被其它目錄上的任何M文件或MATLAB指令窗中的命令所調(diào)用。M文件中,任何指令通過“名字”對(duì)函數(shù)進(jìn)行調(diào)用時(shí),私用函數(shù)的優(yōu)先級(jí)雖低于內(nèi)裝函數(shù)和子函數(shù),但高于其它任何目錄上的函數(shù)。help,lookfor等指令都不能提供關(guān)于私用函數(shù)的任何幫助信息。第12頁(yè),共62頁(yè),2023年,2月20日,星期三4.3.7MATLAB的搜索過程假設(shè)MATLAB在一個(gè)文件中碰到指令cow時(shí),它將按以下步驟逐步進(jìn)行檢索:(1)檢查cow是否一個(gè)變量名;如果不是,執(zhí)行下一步;(2)檢查cow是不是內(nèi)建函數(shù)(Built-inFunction);假如不是,執(zhí)行下一步;(3)檢查cow是不是cow所在的M文件中的一個(gè)子函數(shù);假如不是,再往下執(zhí)行(4)檢查cow是不是cow所在的M文件中的一個(gè)私用函數(shù)(先找cow.p,然后是cow.m);假如不是,再往下執(zhí)行;第13頁(yè),共62頁(yè),2023年,2月20日,星期三(5)檢查cow是不是當(dāng)前目錄上的文件(先找cow.p,然后是cow.m);假如不是,再往下執(zhí)行;(6)檢查搜索路徑上是否有cow存在(先找cow.p,然后是cow.m)。

MATLAB將使用最先找到的那個(gè)cow。如果一直找不到cow,MATLAB就給出錯(cuò)誤提示信息。第14頁(yè),共62頁(yè),2023年,2月20日,星期三4.4MATLAB控制流4.4.1for循環(huán)結(jié)構(gòu)for循環(huán)結(jié)構(gòu)的語(yǔ)法形式:forx=array(commands)end說明:循環(huán)體的執(zhí)行次數(shù)由for指令后面的數(shù)組array的列數(shù)決定。在for后面的表達(dá)式中的數(shù)組可以偽任何合法的MATLAB數(shù)組。循環(huán)結(jié)構(gòu)可以嵌套使用。為了得到高效代碼,應(yīng)盡量提高代碼的向量化程度,而避免使用循環(huán)結(jié)構(gòu)。為了得到高效代碼,在循環(huán)指令之前應(yīng)盡量對(duì)數(shù)組進(jìn)行預(yù)定義。第15頁(yè),共62頁(yè),2023年,2月20日,星期三【例7.3.1-1】一個(gè)簡(jiǎn)單的for循環(huán)示例。fori=1:10;x(i)=i;end;x

第16頁(yè),共62頁(yè),2023年,2月20日,星期三4.4.2while循環(huán)結(jié)構(gòu)while循環(huán)結(jié)構(gòu)的語(yǔ)法形式為:whileexpression(commands)End說明:在while和end之間的“組命令”被稱為循環(huán)體。當(dāng)MATLAB碰到while指令時(shí),首先檢測(cè)expression的值,如其值為邏輯真(非0),則執(zhí)行組命令。當(dāng)組命令執(zhí)行完畢,繼續(xù)檢測(cè)表達(dá)式的值,若表達(dá)式值仍為真,循環(huán)執(zhí)行組命令;而一旦表達(dá)式值為假時(shí),結(jié)束循環(huán)。第17頁(yè),共62頁(yè),2023年,2月20日,星期三【例7.3.2-1】Fibonacci數(shù)組的元素滿足Fibonacci規(guī)則:,;且?,F(xiàn)要求該數(shù)組中第一個(gè)大于10000的元素。a(1)=1;a(2)=1;i=2;whilea(i)<=10000 a(i+1)=a(i-1)+a(i); i=i+1;end;ia(i)第18頁(yè),共62頁(yè),2023年,2月20日,星期三4.4.3if-else-end分支結(jié)構(gòu)指令形式1:ifexpression(commands)end指令形式2:ifexpression(commands1)else(commands2)end指令形式3:ifexpression1(commands1)elseif(expression2)(commands2)……else(commandsk)end第19頁(yè),共62頁(yè),2023年,2月20日,星期三說明:表達(dá)式有時(shí)由多個(gè)邏輯表達(dá)式組成,MATLAB將盡可能少的檢測(cè)子表達(dá)式的值。例如,表達(dá)式為(子表達(dá)式1|表達(dá)式2),當(dāng)MATLAB檢測(cè)到子表達(dá)式1的值為真時(shí),它就認(rèn)為表達(dá)式值為真,而不再對(duì)表達(dá)式2進(jìn)行檢測(cè)。又如表達(dá)式1&表達(dá)式2)當(dāng)MATLAB檢測(cè)到子表達(dá)式1的值為假時(shí),它就認(rèn)為表達(dá)式值為假的,從而跳過該結(jié)構(gòu)。if指令判決和break指令的配合使用,可以強(qiáng)制終止for循環(huán)或while循環(huán)。第20頁(yè),共62頁(yè),2023年,2月20日,星期三【例7.3.3-2】用for循環(huán)指令來尋求Fibonacc數(shù)組中第一個(gè)大于10000的元素。n=100;a=ones(1,n);fori=3:na(i)=a(i-1)+a(i-2);ifa(i)>=10000a(i),break;end;endi

第21頁(yè),共62頁(yè),2023年,2月20日,星期三4.4.4switch-case結(jié)構(gòu)語(yǔ)法結(jié)構(gòu):switchexcasetest1(commands1)casetest2……casetestk(commandsk)otherwise(commands)end第22頁(yè),共62頁(yè),2023年,2月20日,星期三說明:switch指令后面的表達(dá)式應(yīng)為一個(gè)標(biāo)量或者為一個(gè)字符串。對(duì)于標(biāo)量形式的表達(dá)式,比較這樣進(jìn)行:表達(dá)式==檢測(cè)值i。而對(duì)于字符串,MATLAB將調(diào)用函數(shù)strcmp來實(shí)現(xiàn)比較:strcmp(表達(dá)式,檢測(cè)值i)。case指令后面的檢測(cè)值不僅可以為一個(gè)標(biāo)量值或一個(gè)字符串,還可以為一個(gè)元胞數(shù)組。如果一個(gè)檢測(cè)值是一個(gè)元胞數(shù)組,MATLAB將把表達(dá)式的值和該元胞數(shù)組中的所有元素進(jìn)行比較,如果元胞數(shù)組中的某個(gè)元素和表達(dá)式的值相等,MATLAB認(rèn)為此次比較結(jié)果為真,從而執(zhí)行與該檢測(cè)值相應(yīng)的一組命令。第23頁(yè),共62頁(yè),2023年,2月20日,星期三【例7.3.4-1】學(xué)生的成績(jī)管理,用來演示switch結(jié)構(gòu)的應(yīng)用。clear;fori=1:10;a{i}=89+i;b{i}=79+i;c{i}=69+i;d{i}=59+i;end;c=[d,c];Name={'Jack','Marry','Peter','Rose','Tom'};Mark={72,83,56,94,100};Rank=cell(1,5);S=struct('Name',Name,'Marks',Mark,'Rank',Rank);fori=1:5switchS(i).Markscase100S(i).Rank='滿分';caseaS(i).Rank='優(yōu)秀';caseb S(i).Rank='良好';casec S(i).Rank='及格';otherwise S(i).Rank='不及格';endenddisp(['學(xué)生姓名','得分','等級(jí)']);disp('')fori=1:5;disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]);end;

第24頁(yè),共62頁(yè),2023年,2月20日,星期三4.4.5try-catch結(jié)構(gòu)語(yǔ)法結(jié)構(gòu):try(commands1)catch(commands2)end說明:只有當(dāng)MATLAB在執(zhí)行組命令1時(shí)出現(xiàn)了錯(cuò)誤后,組命令2才會(huì)被執(zhí)行。可調(diào)用lasterr函數(shù)查詢出錯(cuò)原因。如果函數(shù)lasterr的運(yùn)行結(jié)果為一個(gè)空串,則表明組命令1被成功執(zhí)行了。當(dāng)執(zhí)行組命令2時(shí)又出錯(cuò),MATLAB將終止該結(jié)構(gòu)第25頁(yè),共62頁(yè),2023年,2月20日,星期三【例7.3.5-1】try-catch結(jié)構(gòu)應(yīng)用實(shí)例:對(duì)魔方陣的行進(jìn)行援引,當(dāng)“行下標(biāo)”超出魔方陣的最大行數(shù)時(shí),將改向?qū)ψ詈笠恍械脑?,并顯示“出錯(cuò)”警告。clear,N=4;A=magic(3);tryA_N=A(N,:)catchA_end=A(end,:)endlasterr

第26頁(yè),共62頁(yè),2023年,2月20日,星期三4.4.6控制程序流的其它常用指令1.return指令在被調(diào)函數(shù)中插入了return指令,可以強(qiáng)制MATLAB結(jié)束執(zhí)行該函數(shù)并把控制轉(zhuǎn)出。2.input和keyboard(1)input常用格式:v=input(‘message’)%將用戶鍵入的內(nèi)容賦給變量vv=input(‘message’,’s’)%將用戶鍵入的內(nèi)容作為字符串賦給變量v第27頁(yè),共62頁(yè),2023年,2月20日,星期三說明:指令中’message’是將顯示在屏幕上的字符串,這是必不可少的。對(duì)于第一種調(diào)用格式,用戶可以輸入數(shù)值、字符串元胞數(shù)組等各種形式的數(shù)據(jù)。對(duì)于第二種調(diào)用格式,不管鍵入什么,總以字符串形式賦給變量v。(2)keyboard

當(dāng)程序遇到keyboard時(shí),MATLAB將“控制權(quán)”交給鍵盤,用戶可以從鍵盤輸入各種合法的MATLAB指令,只有當(dāng)用戶使用return指令結(jié)束輸入后,“控制權(quán)”才交還給程序。第28頁(yè),共62頁(yè),2023年,2月20日,星期三4.pause指令pause%暫停執(zhí)行文件,等待用戶鍵入任意鍵繼續(xù)pause(n)%在繼續(xù)執(zhí)行之前,暫停n秒5.break指令

break指令導(dǎo)致包含有該指令的while、for指令的終止,不必等待循環(huán)的自然結(jié)束。第29頁(yè),共62頁(yè),2023年,2月20日,星期三6.error和warning指令error(‘message’)%顯示出錯(cuò)信息message,終止程序。errortrap%錯(cuò)誤發(fā)生后,程序繼續(xù)執(zhí)行與否分雙位開關(guān)。lasterr%顯示MATLAB自動(dòng)判斷的最新出錯(cuò)原因,并終止程序。warning(‘message’)%顯示警告信息message,程序繼續(xù)執(zhí)行。lastwarn%顯示MATLAB自動(dòng)給出的最新警告,程序繼續(xù)運(yùn)行。第30頁(yè),共62頁(yè),2023年,2月20日,星期三4.5變量的檢測(cè)傳遞和限權(quán)使用函數(shù)4.5.1輸入輸出宗量檢測(cè)函數(shù)nargin%在函數(shù)體內(nèi)用于獲取實(shí)際輸入宗量;nargout%在函數(shù)體內(nèi)用于獲取實(shí)際輸出宗量;nargin(‘fun’)%獲取’fun’指定函數(shù)的標(biāo)稱輸入宗量數(shù);nargout(‘fun’)%獲取’fun’指定函數(shù)的標(biāo)稱輸出宗量數(shù);inputname(n)%在函數(shù)體內(nèi)使用,給出第n各輸入宗量的實(shí)際調(diào)用變量名第31頁(yè),共62頁(yè),2023年,2月20日,星期三4.5.2“變長(zhǎng)度”輸入輸出宗量varargin%“變長(zhǎng)度”輸入宗量列表varargout%“變長(zhǎng)度”輸出宗量列表說明:編寫M函數(shù)文件時(shí),函數(shù)申明行中的“變長(zhǎng)度”宗量必須被放置在“普通”宗量之后在編寫M函數(shù)文件時(shí),varargin的長(zhǎng)度隨分配到的輸入變量數(shù)而變;第32頁(yè),共62頁(yè),2023年,2月20日,星期三varargin,varargout的工作機(jī)理varargin本身是個(gè)元胞數(shù)組;M函數(shù)文件被調(diào)用時(shí),函數(shù)輸入變量的分配原則是:首先,輸入變量依先后次序逐個(gè)對(duì)應(yīng)分配給M函數(shù)文件輸入宗量列表中那些被明確定義的“普通”輸入宗量;然后,把剩余的輸入變量一次逐個(gè)分配到varargin元胞數(shù)組的元胞中。因此varargin元胞數(shù)組的長(zhǎng)度取決于分配到的輸入變量數(shù)。所謂“變長(zhǎng)度”,就是指:varargin的長(zhǎng)度隨分配到的輸入變量數(shù)而變。第33頁(yè),共62頁(yè),2023年,2月20日,星期三【例7.5.2-1】變長(zhǎng)度宗量使用示例。[exm07052_1.m]functionvarargout=exm07052_1(r,varargin)vin=length(varargin);Nin=vin+1; error(nargchk(1,Nin,nargin)) ifnargout>6 error('Toomanyoutputarguments')endt=0:pi/20:2*pi;x=r*exp(i*t);s=pi*r*r;第34頁(yè),共62頁(yè),2023年,2月20日,星期三ifnargout==0switchNincase1plot(x,'b')case2r2=varargin{1}; x2=r2*exp(i*t);plot(x,'b');holdon;plot(x2,'b');holdoffotherwiser2=varargin{1}; x2=r2*exp(i*t);plot(x,varargin{2:end});holdon plot(x2,varargin{2:end});holdoff end;axis('square')第35頁(yè),共62頁(yè),2023年,2月20日,星期三elsevarargout{1}=real(x);varargout{2}=imag(x); varargout{5}=pi*r*r;varargout{6}=[]; ifNin>1r2=varargin{1}; x2=r2*exp(i*t);varargout{3}=real(x2);varargout{4}=imag(x2);varargout{6}=pi*(r^2-r2^2); end;end第36頁(yè),共62頁(yè),2023年,2月20日,星期三r1=1;r2=3;[x1,y1,x2,y2,s1,s2]=exm07052_1(r1);[x1,y1,x2,y2]=exm07052_1(r1,r2);[x1,y1,x2,y2,s1,s2]=exm07052_1(r1,r2);r1=1;r2=0.6;subplot(1,3,1),exm07052_1(r1,r2),subplot(1,3,2),exm07052_1(r1,r2,'Marker','o')subplot(1,3,3),exm07052_1(r1,r2,'LineWidth',5,'Color',[10.40])

第37頁(yè),共62頁(yè),2023年,2月20日,星期三4.5.3跨空間變量傳遞1.跨空間計(jì)算串表達(dá)式的值evalin(‘workspace’,’expression’)%跨空間計(jì)算串表達(dá)式值evalin(‘workspace’,’expression1’,’expression2’)%跨空間計(jì)算替代串表達(dá)式值說明:‘workspace’可取兩個(gè)值:‘base’和‘caller’。第一種調(diào)用格式的執(zhí)行機(jī)理當(dāng)‘workspace’取‘base’時(shí),表示計(jì)算eval(‘expression’)時(shí),將從基本工作空間中獲得變量值第38頁(yè),共62頁(yè),2023年,2月20日,星期三當(dāng)‘workspace’取‘caller’時(shí),表示計(jì)算eval(‘expression’)時(shí),將從主調(diào)函數(shù)工作空間獲得變量值。主調(diào)函數(shù)是相對(duì)被調(diào)函數(shù)而言的。這里被調(diào)函數(shù)是指evalin所在的函數(shù)。第二種調(diào)用格式的執(zhí)行機(jī)理是:先從所在函數(shù)空間獲取變量值,用eval(‘expression1’)計(jì)算原串表達(dá)式;如若該計(jì)算失敗,則再?gòu)摹畐orkspace’指定的(基本或主調(diào)函數(shù))工作空間獲取變量值,再通過eval(‘expression2’)計(jì)算替代串表達(dá)式。第39頁(yè),共62頁(yè),2023年,2月20日,星期三【例-1】本例演示:(A)編寫繪制正多邊形或圓的程序。(B)子函數(shù)與(母)函數(shù)的關(guān)系。(C)各種不同的工作空間。(D)evalin運(yùn)行機(jī)理與eval的異同。(1)[exm070531_1.m]functiony1=exm070531_1(a,s)t=(0:a)/a*2*pi;y1=subevalinzzy(4,s);%------------subfunction-------------functiony2=subevalinzzy(a,s)t=(0:a)/a*2*pi;ss='a*exp(i*t)';switchscase{'base','caller'}y2=evalin(s,ss);case'self'y2=eval(ss);end第40頁(yè),共62頁(yè),2023年,2月20日,星期三(2)clear,a=30;t=(0:a)/a*2*pi;sss={'base','caller','self'};fork=1:3 y0=exm070531_1(8,sss{k}); subplot(1,3,k) plot(real(y0),imag(y0),'r','LineWidth',3),axissquareimageend

第41頁(yè),共62頁(yè),2023年,2月20日,星期三2.跨空間賦值assignin(‘workspace’,’VN’,X)%跨空間向VN變量賦值【例-1】assignin運(yùn)作機(jī)理示范。[EXM070532_1.M]functiony=exm070532_1(x)y=sqrt(x);t=x^2;assignin('base','yy',t)clear;x=4;y=exm070532_1(x);disp([blanks(5),'x',blanks(5),'y',blanks(4),'yy']disp([x,y,yy])

第42頁(yè),共62頁(yè),2023年,2月20日,星期三4.6串演算函數(shù)4.6.1evaly=eval(‘CEM’)%執(zhí)行CEM指定的計(jì)算y=eval(‘CEM1’,‘CEM1’)%執(zhí)行CEM1指定的計(jì)算,如果出錯(cuò),就執(zhí)行CEM2[y1,y2,…]=eval(‘CEM’)%執(zhí)行對(duì)CEM代表的函數(shù)文件調(diào)用,并輸出計(jì)算結(jié)果第43頁(yè),共62頁(yè),2023年,2月20日,星期三說明:Eval指令的輸入宗量必須是字符串構(gòu)成字符串的CEM,可以是MATLAB任何合法的指令、表達(dá)式、語(yǔ)句或M文件名。第3種格式中的CEM只能是(包含輸入宗量在內(nèi)的)M函數(shù)文件名。第44頁(yè),共62頁(yè),2023年,2月20日,星期三【例7.6.1-1】計(jì)算“表達(dá)式”串,產(chǎn)生向量值。clear,t=pi;cem='[t/2,t*2,sin(t)]';y=eval(cem)

第45頁(yè),共62頁(yè),2023年,2月20日,星期三【例7.6.1-2】計(jì)算“語(yǔ)句”串,創(chuàng)建變量。clear,t=pi;eval('theta=t/2,y=sin(theta)');who第46頁(yè),共62頁(yè),2023年,2月20日,星期三【例7.6.1-3】計(jì)算“替代”串。A=ones(2,1);B=ones(1,3);c=eval('B*A','A*B'),errmessage=lasterr

第47頁(yè),共62頁(yè),2023年,2月20日,星期三【例7.6.1-4】計(jì)算“合成”串。CEM={'cos','sin','tan'};fork=1:3 theta=pi*k/12; y(1,k)=eval([CEM{1},'(',num2str(theta),')']);endy

第48頁(yè),共62頁(yè),2023年,2月20日,星期三4.6.2feval[y1,y2,…]=feval(‘FN’,arg1,arg2,…)%用參量arg1,arg2等執(zhí)行函數(shù)指定的計(jì)算說明:‘FN’只能是函數(shù)名在既可以使用eval,又可以使用feval的情況下,feval運(yùn)行效率更高。第49頁(yè),共62頁(yè),2023年,2月20日,星期三【例7.6.2-1】feval和eval運(yùn)行區(qū)別之一:feval的FN絕對(duì)不能是表達(dá)式。x=pi/4;Ve=eval('1+sin(x)')Vf=feval('1+sin(x)',x)

第50頁(yè),共62頁(yè),2023年,2月20日,星期三【例7.6.2-2】feval和eval調(diào)用區(qū)別:feval的FN只接受函數(shù)名。本例兩種方法以后者為好。A=rand(2,2);[ue,de,ve]=eval('svd(A)');disp('Resultsbyeval');disp([ue,de,ve]);disp(blanks(1))[uf,df,vf]=feval('svd',A);disp('Resultsbyfeval');disp([uf,df,vf])第51頁(yè),共62頁(yè),2023年,2月20日,星期三4.6.3內(nèi)聯(lián)函數(shù)1.內(nèi)聯(lián)函數(shù)的創(chuàng)建inline(‘CE’)%把串表達(dá)式轉(zhuǎn)化為輸入宗量自動(dòng)生成的內(nèi)聯(lián)函數(shù)inline(‘CE’,arg1,arg2,…)%把串表達(dá)式轉(zhuǎn)化為arg1,arg2等指定輸入宗量的內(nèi)聯(lián)函數(shù)inline(‘CE’,n)%把串表達(dá)式轉(zhuǎn)化為x,P1,P2,…Pn等指定輸入宗量的內(nèi)聯(lián)函數(shù)第52頁(yè),共62頁(yè),2023年,2月20日,星期三說明:‘CE’是字符串;CE必須不包含賦值號(hào)“=”的表達(dá)式。第1種調(diào)用格式將自動(dòng)地對(duì)CE進(jìn)行辨識(shí),把CE中由字母/數(shù)字組成的連續(xù)字符認(rèn)做變量,除“預(yù)定義變量名(如i,j,pi)”和“常用函數(shù)名(如sin,svd)”以外的由字母/數(shù)字組成的連續(xù)字符將被認(rèn)做變量。但注意:若連續(xù)字符后緊接“左圓括號(hào)”,那么將不被當(dāng)作輸入宗量。如x(1),就不會(huì)認(rèn)做輸入宗量處理。第2中調(diào)用格式是創(chuàng)建內(nèi)聯(lián)函數(shù)最穩(wěn)妥、可靠途徑。輸入宗量字符可表達(dá)得更自如。第三種調(diào)用格式最簡(jiǎn)練,但對(duì)輸入輸出宗量的字符限制嚴(yán)格。輸入宗量字符只能是x,P1,…Pn等。注意:P是大寫字母。第53頁(yè),共62頁(yè),2023年,2月20日,星期三2.涉及內(nèi)聯(lián)函數(shù)性質(zhì)的指令class(inline_fun)%給出內(nèi)聯(lián)函數(shù)的類型char(inline_fun)%給出內(nèi)聯(lián)函數(shù)計(jì)算公式argnames(inline_fun)%給出內(nèi)聯(lián)函數(shù)的輸入宗量vectorize(inline_fun)%使內(nèi)聯(lián)函數(shù)適用“數(shù)組運(yùn)算”規(guī)則第54頁(yè),共62頁(yè),2023年,2月20日,星期三【例-1】演示:內(nèi)聯(lián)函數(shù)的第一種創(chuàng)建格式;使內(nèi)聯(lián)函數(shù)適于“數(shù)組運(yùn)算”。clear,F1=inline('sin(r

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論