版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第四章的程序設(shè)計(jì)(chénɡxùshèjì)和調(diào)試第一頁(yè),共62頁(yè)。4.3腳本文件和函數(shù)文件4.3.1M腳本文件(一)腳本文件的特點(diǎn):它只是一串按用戶(hù)意圖排列而成的(包括控制(kòngzhì)流向指令在內(nèi)的)MATLAB指令集合腳本文件運(yùn)行后,所產(chǎn)生的所有變量都駐留在MATLAB基本工作空間(BaseWorkspace)中。只要用戶(hù)不使用clear指令加以清除,且MATLAB指令窗不關(guān)閉,這些變量將一直保存在基本工作空間中。基本空間將隨MATLAB的啟動(dòng)而產(chǎn)生;只有關(guān)閉MATLAB時(shí),該基本工作空間才被刪除。第二頁(yè),共62頁(yè)。(二)M腳本文件的編寫(xiě)和運(yùn)行(1)編寫(xiě)M腳本文件的步驟點(diǎn)擊MATLAB指令窗工具條上的NewFile圖標(biāo),就可打開(kāi)MATLAB文件編輯調(diào)試器MATLABEditor/Debugger,其窗口名為untitled,用戶(hù)即可在空白窗口中編寫(xiě)程序。編輯完程序,點(diǎn)擊編輯調(diào)試器工具條上的保存圖標(biāo),在彈出的Windows標(biāo)準(zhǔn)(biāozhǔn)風(fēng)格的“保存為”對(duì)話(huà)框中,選擇保存文件夾,鍵入新編文件的文件名,點(diǎn)【保存】鍵,就完成了文件的保存。(2)運(yùn)行文件使剛剛保存的文件所在的目錄成為當(dāng)前目錄,或讓該目錄處在MATLAB的搜索路徑上。直接在命令窗口鍵入運(yùn)行文件的文件名或在編輯器窗口中直接點(diǎn)擊工具條上的運(yùn)行按鈕都可運(yùn)行該M文件。第三頁(yè),共62頁(yè)。4.3.2M函數(shù)文件(一)M函數(shù)文件的特點(diǎn)從形式上看,與腳本(jiǎoběn)文件不同,函數(shù)文件的第一行總是一“function”引導(dǎo)的“函數(shù)申明行(FunctionDeclarationline)”。該行還羅列出函數(shù)與外界的聯(lián)系的全部“標(biāo)稱(chēng)”輸入輸出宗量。但對(duì)“輸入輸出宗量”的標(biāo)稱(chēng)數(shù)目并沒(méi)有限制,既可以完全沒(méi)有輸入輸出宗量,也可以時(shí)任意數(shù)目。MATLAB允許使用比“標(biāo)稱(chēng)數(shù)目”較少的輸入輸出宗量,實(shí)現(xiàn)對(duì)函數(shù)的調(diào)用。第四頁(yè),共62頁(yè)。從運(yùn)行上看,與腳本文件不同,每當(dāng)函數(shù)文件運(yùn)行,MATLAB就會(huì)專(zhuān)門(mén)為它開(kāi)辟一個(gè)臨時(shí)工作空間(Contextworkspace)。該空間稱(chēng)之為函數(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ú)立(dúlì)的、臨時(shí)的。在MATLAB整個(gè)運(yùn)行期間,可以產(chǎn)生任意多個(gè)臨時(shí)函數(shù)空間。假如在函數(shù)文件中,發(fā)生對(duì)某腳本文件的調(diào)用,那么該腳本文件運(yùn)行產(chǎn)生的所有變量都存放于那函數(shù)空間之中,而不是存放在基本空間。第五頁(yè),共62頁(yè)。第四十九頁(yè),共62頁(yè)。a(i),casetest2標(biāo)志編寫(xiě)及修改M文件的作者和日期;構(gòu)成字符串的CEM,可以是MATLAB任何合法的指令、表達(dá)式、語(yǔ)句或M文件名。5try-catch結(jié)構(gòu)對(duì)于第二種調(diào)用格式,不管鍵入什么,總以字符串形式賦給變量v。MATLAB將使用最先找到的那個(gè)cow。腳本文件運(yùn)行后,所產(chǎn)生的所有變量都駐留在MATLAB基本工作空間(BaseWorkspace)中。x=randn(1,100);1輸入輸出宗量檢測(cè)(jiǎncè)函數(shù)第一種調(diào)用格式的執(zhí)行機(jī)理內(nèi)聯(lián)函數(shù)(hánshù)的創(chuàng)建表達(dá)式有時(shí)(yǒushí)由多個(gè)邏輯表達(dá)式組成,MATLAB將盡可能少的檢測(cè)子表達(dá)式的值。inputname(n)y=eval(‘CEM1’,‘CEM1’)4.3.3局部變量和全局變量(1)局部(Local)變量存在于函數(shù)空間內(nèi)部(nèibù)的中間變量,產(chǎn)生于該函數(shù)的運(yùn)行過(guò)程中,其影響范圍僅限于該函數(shù)本身。(2)全局(Global)變量通過(guò)global指令,MATLAB也允許幾個(gè)不同的函數(shù)空間以及基本工作空間共享同一個(gè)變量。這種被共享的變量稱(chēng)為全局變量。每個(gè)希望共享全局變量的函數(shù)或MATLAB基本工作空間,必須逐個(gè)用global對(duì)其具體變量加以專(zhuān)門(mén)定義。沒(méi)采用global定義的函數(shù)或基本工作空間,將無(wú)權(quán)享用全局變量。第六頁(yè),共62頁(yè)。補(bǔ)充說(shuō)明:如果某個(gè)函數(shù)的運(yùn)作使全局變量的內(nèi)容發(fā)生了變化,那么其它函數(shù)空間以及基本工作空間中的同名變量也隨之變化。除非與全局變量聯(lián)系的所有工作空間都被刪除,否則全局變量依然存在(cúnzài)。對(duì)全局變量的定義必須在該變量被使用之前進(jìn)行。建議把全局變量的定義放在函數(shù)體的首行位置。雖然MATLAB對(duì)全局變量的名字并沒(méi)有任何特別的限制,但是為了提高M(jìn)文件的可讀性,建議使用大寫(xiě)字符命名全局變量。第七頁(yè),共62頁(yè)。4.3.4M文件的一般結(jié)構(gòu)典型M函數(shù)文件的結(jié)構(gòu)如下:函數(shù)申明行(Functiondeclarationline):位于函數(shù)文件的首行,以MATLAB關(guān)鍵字function開(kāi)頭,函數(shù)名以及函數(shù)的輸入輸出宗量都在這一行被定義。H1行(Thefirsthelptextline);緊隨函數(shù)聲明行之后以%號(hào)開(kāi)頭的第一注釋行。按MATLAB自身(zìshēn)文件的規(guī)則,H1行包含:大寫(xiě)字體的函數(shù)文件名和運(yùn)用關(guān)鍵詞簡(jiǎn)要描述的函數(shù)功能。該H1行供lookfor關(guān)鍵詞查詢(xún)和help在線幫助使用第八頁(yè),共62頁(yè)。在線幫助文本(Helptext)區(qū):H1行及其之后的連續(xù)的以%開(kāi)頭的所有注釋行構(gòu)成整個(gè)在線幫助文本。它通常包括:函數(shù)輸入(shūrù)輸出宗量的含義;調(diào)用格式說(shuō)明。編寫(xiě)和修改記錄:它與在線幫助文本區(qū)相隔一個(gè)“空”行;也以%開(kāi)頭;標(biāo)志編寫(xiě)及修改M文件的作者和日期;版本記錄。它用作軟件檔案管理。函數(shù)體(Functionbody):為清晰起見(jiàn),它與前面的注釋以“空”行相隔。這部分內(nèi)容由實(shí)現(xiàn)M函數(shù)功能的MATLAB指令組成。它接收輸入(shūrù)宗量,進(jìn)行程序流控制,得到輸出宗量。其中為閱讀、理解方便,也配置適當(dāng)?shù)目招泻妥⑨尅H魞H從運(yùn)算的角度看,唯“函數(shù)申明行”和“函數(shù)體”兩部分是構(gòu)成M函數(shù)文件所必不可少的。第九頁(yè),共62頁(yè)。4.3.6子函數(shù)和私用函數(shù)1.子函數(shù)MATLAB允許一個(gè)M函數(shù)文件包含多個(gè)函數(shù)的代碼。其中第一個(gè)出現(xiàn)的那個(gè)函數(shù)稱(chēng)為主函數(shù)(Primaryfunction),該文件中的其他函數(shù)則稱(chēng)為子函數(shù)(Subfunction)。保存時(shí)所用(suǒyònɡ)函數(shù)名與主函數(shù)定義名相同。外部程序只能對(duì)主函數(shù)進(jìn)行調(diào)用。第十頁(yè),共62頁(yè)。子函數(shù)的性質(zhì):每個(gè)子函數(shù)的第1行是其自己的函數(shù)申明行。在M函數(shù)文件內(nèi),主函數(shù)的位置不可改變,但子函數(shù)的排列次序可以任意改變。子函數(shù)智能被處于同一文件的主函數(shù)或其它其函數(shù)調(diào)用。在M函數(shù)文件中,任何指令通過(guò)“名字”對(duì)函數(shù)進(jìn)行(jìnxíng)調(diào)用時(shí),子函數(shù)的優(yōu)先級(jí)僅次于內(nèi)裝函數(shù)。同一文件的主函數(shù)、子函數(shù)的工作空間都是彼此獨(dú)立的。各函數(shù)間的信息,或通過(guò)輸入輸出變量傳遞,或通過(guò)全局變量傳遞,或通過(guò)跨空間指令傳遞。help,lookfor等幫助指令都不能提供關(guān)于子函數(shù)的任何幫助信息。第十一頁(yè),共62頁(yè)。2.私用函數(shù)所謂私用函數(shù),是指位于private目錄上的M文件函數(shù)。它有如下性質(zhì):私用函數(shù)的構(gòu)造與普通M函數(shù)完全相同。私用函數(shù)只能被private直接父目錄上的M文件所調(diào)用,而不能被其它目錄上的任何M文件或MATLAB指令窗中的命令所調(diào)用。M文件中,任何指令通過(guò)“名字”對(duì)函數(shù)進(jìn)行(jìnxíng)調(diào)用時(shí),私用函數(shù)的優(yōu)先級(jí)雖低于內(nèi)裝函數(shù)和子函數(shù),但高于其它任何目錄上的函數(shù)。help,lookfor等指令都不能提供關(guān)于私用函數(shù)的任何幫助信息。第十二頁(yè),共62頁(yè)。4.3.7MATLAB的搜索過(guò)程假設(shè)MATLAB在一個(gè)文件中碰到指令cow時(shí),它將按以下步驟逐步進(jìn)行檢索:(1)檢查cow是否一個(gè)變量名;如果不是,執(zhí)行下一步;(2)檢查cow是不是內(nèi)建函數(shù)(hánshù)(Built-inFunction);假如不是,執(zhí)行下一步;(3)檢查cow是不是cow所在的M文件中的一個(gè)子函數(shù)(hánshù);假如不是,再往下執(zhí)行(4)檢查cow是不是cow所在的M文件中的一個(gè)私用函數(shù)(hánshù)(先找,然后是);假如不是,再往下執(zhí)行;第十三頁(yè),共62頁(yè)。(5)檢查cow是不是當(dāng)前目錄上的文件(先找,然后是);假如不是,再往下執(zhí)行;(6)檢查搜索(sōusuǒ)路徑上是否有cow存在(先找,然后是)。MATLAB將使用最先找到的那個(gè)cow。如果一直找不到cow,MATLAB就給出錯(cuò)誤提示信息。第十四頁(yè),共62頁(yè)。4.4MATLAB控制流4.4.1for循環(huán)結(jié)構(gòu)for循環(huán)結(jié)構(gòu)的語(yǔ)法(yǔfǎ)形式:forx=array(commands)end說(shuō)明:循環(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ù)定義。第十五頁(yè),共62頁(yè)?!纠?.3.1-1】一個(gè)(yīɡè)簡(jiǎn)單的for循環(huán)示例。fori=1:10;x(i)=i;end;x第十六頁(yè),共62頁(yè)。4.4.2while循環(huán)結(jié)構(gòu)while循環(huán)結(jié)構(gòu)的語(yǔ)法形式為:whileexpression(commands)End說(shuō)明:在while和end之間的“組命令”被稱(chēng)為(chēnɡwéi)循環(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)。第十七頁(yè),共62頁(yè)?!纠?.3.2-1】Fibonacci數(shù)組的元素滿(mǎn)足Fibonacci規(guī)則(guīzé):,;且?,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)第十八頁(yè),共62頁(yè)。4.4.3if-else-end分支結(jié)構(gòu)指令(zhǐlìng)形式1:ifexpression(commands)end指令(zhǐlìng)形式2:ifexpression(commands1)else(commands2)end指令(zhǐlìng)形式3:ifexpression1(commands1)elseif(expression2)(commands2)……else(commandsk)end第十九頁(yè),共62頁(yè)。說(shuō)明:表達(dá)式有時(shí)(yǒushí)由多個(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á)式值為假的,從而跳過(guò)該結(jié)構(gòu)。if指令判決和break指令的配合使用,可以強(qiáng)制終止for循環(huán)或while循環(huán)。第二十頁(yè),共62頁(yè)?!纠?.3.3-2】用for循環(huán)(xúnhuán)指令來(lái)尋求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第二十一頁(yè),共62頁(yè)。4.4.4switch-case結(jié)構(gòu)(jiégòu)語(yǔ)法結(jié)構(gòu)(jiégòu):switchexcasetest1(commands1)casetest2……casetestk(commandsk)otherwise(commands)end第二十二頁(yè),共62頁(yè)。說(shuō)明:switch指令后面的表達(dá)式應(yīng)為一個(gè)標(biāo)量或者(huòzhě)為一個(gè)字符串。對(duì)于標(biāo)量形式的表達(dá)式,比較這樣進(jìn)行:表達(dá)式==檢測(cè)值i。而對(duì)于字符串,MATLAB將調(diào)用函數(shù)strcmp來(lái)實(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)的一組命令。第二十三頁(yè),共62頁(yè)?!纠?.3.4-1】學(xué)生的成績(jī)管理,用來(lái)演示switch結(jié)構(gòu)(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='滿(mǎn)分';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;第二十四頁(yè),共62頁(yè)。4.4.5try-catch結(jié)構(gòu)語(yǔ)法結(jié)構(gòu):try(commands1)catch(commands2)end說(shuō)明:只有當(dāng)MATLAB在執(zhí)行組命令1時(shí)出現(xiàn)了錯(cuò)誤后,組命令2才會(huì)被執(zhí)行。可調(diào)用lasterr函數(shù)查詢(xún)出錯(cuò)原因。如果函數(shù)lasterr的運(yùn)行結(jié)果為一個(gè)(yīɡè)空串,則表明組命令1被成功執(zhí)行了。當(dāng)執(zhí)行組命令2時(shí)又出錯(cuò),MATLAB將終止該結(jié)構(gòu)第二十五頁(yè),共62頁(yè)?!纠?.3.5-1】try-catch結(jié)構(gòu)應(yīng)用(yìngyò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第二十六頁(yè),共62頁(yè)。4.4.6控制程序流的其它常用指令指令在被調(diào)函數(shù)中插入了return指令,可以強(qiáng)制MATLAB結(jié)束執(zhí)行該函數(shù)并把控制轉(zhuǎn)出。和keyboard(1)input常用格式:v=input(‘message’)%將用戶(hù)鍵入的內(nèi)容賦給變量(biànliàng)vv=input(‘message’,’s’)%將用戶(hù)鍵入的內(nèi)容作為字符串賦給變量(biànliàng)v第二十七頁(yè),共62頁(yè)。說(shuō)明:指令中’message’是將顯示在屏幕上的字符串,這是必不可少的。對(duì)于第一種調(diào)用格式,用戶(hù)可以輸入(shūrù)數(shù)值、字符串元胞數(shù)組等各種形式的數(shù)據(jù)。對(duì)于第二種調(diào)用格式,不管鍵入什么,總以字符串形式賦給變量v。(2)keyboard當(dāng)程序遇到keyboard時(shí),MATLAB將“控制權(quán)”交給鍵盤(pán),用戶(hù)可以從鍵盤(pán)輸入(shūrù)各種合法的MATLAB指令,只有當(dāng)用戶(hù)使用return指令結(jié)束輸入(shūrù)后,“控制權(quán)”才交還給程序。第二十八頁(yè),共62頁(yè)。指令pause%暫停執(zhí)行文件,等待用戶(hù)鍵入任意鍵繼續(xù)pause(n)%在繼續(xù)執(zhí)行之前,暫停n秒指令break指令導(dǎo)致包含有該指令的while、for指令的終止,不必等待循環(huán)的自然(zìrán)結(jié)束。第二十九頁(yè),共62頁(yè)。和warning指令error(‘message’)%顯示出錯(cuò)信息message,終止程序。errortrap%錯(cuò)誤發(fā)生后,程序繼續(xù)(jìxù)執(zhí)行與否分雙位開(kāi)關(guān)。lasterr%顯示MATLAB自動(dòng)判斷的最新出錯(cuò)原因,并終止程序。warning(‘message’)%顯示警告信息message,程序繼續(xù)(jìxù)執(zhí)行。lastwarn%顯示MATLAB自動(dòng)給出的最新警告,程序繼續(xù)(jìxù)運(yùn)行。第三十頁(yè),共62頁(yè)。變量的檢測(cè)(jiǎncè)傳遞和限權(quán)使用函數(shù)4.5.1輸入輸出宗量檢測(cè)(jiǎncè)函數(shù)nargin%在函數(shù)體內(nèi)用于獲取實(shí)際輸入宗量;nargout%在函數(shù)體內(nèi)用于獲取實(shí)際輸出宗量;nargin(‘fun’)%獲取’fun’指定函數(shù)的標(biāo)稱(chēng)輸入宗量數(shù);nargout(‘fun’)%獲取’fun’指定函數(shù)的標(biāo)稱(chēng)輸出宗量數(shù);inputname(n)%在函數(shù)體內(nèi)使用,給出第n各輸入宗量的實(shí)際調(diào)用變量名第三十一頁(yè),共62頁(yè)。4.5.2“變長(zhǎng)度”輸入輸出宗量varargin%“變長(zhǎng)度”輸入宗量列表varargout%“變長(zhǎng)度”輸出宗量列表說(shuō)明:編寫(xiě)M函數(shù)文件時(shí),函數(shù)申明行中的“變長(zhǎng)度”宗量必須被放置在“普通”宗量之后在編寫(xiě)M函數(shù)文件時(shí),varargin的長(zhǎng)度隨分配(fēnpèi)到的輸入變量數(shù)而變;第三十二頁(yè),共62頁(yè)。varargin,varargout的工作機(jī)理varargin本身是個(gè)元胞數(shù)組;M函數(shù)文件被調(diào)用時(shí),函數(shù)輸入(shūrù)變量的分配原則是:首先,輸入(shūrù)變量依先后次序逐個(gè)對(duì)應(yīng)分配給M函數(shù)文件輸入(shūrù)宗量列表中那些被明確定義的“普通”輸入(shūrù)宗量;然后,把剩余的輸入(shūrù)變量一次逐個(gè)分配到varargin元胞數(shù)組的元胞中。因此varargin元胞數(shù)組的長(zhǎng)度取決于分配到的輸入(shūrù)變量數(shù)。所謂“變長(zhǎng)度”,就是指:varargin的長(zhǎng)度隨分配到的輸入(shūrù)變量數(shù)而變。第三十三頁(yè),共62頁(yè)?!纠?.5.2-1】變長(zhǎng)度(chángdù)宗量使用示例。[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;第三十四頁(yè),共62頁(yè)。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')第三十五頁(yè),共62頁(yè)。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第三十六頁(yè),共62頁(yè)。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])
第三十七頁(yè),共62頁(yè)。4.5.3跨空間變量傳遞1.跨空間計(jì)算串表達(dá)式的值evalin(‘workspace’,’expression’)%跨空間計(jì)算串表達(dá)式值evalin(‘workspace’,’expression1’,’expression2’)%跨空間計(jì)算替代串表達(dá)式值說(shuō)明:‘workspace’可取兩個(gè)值:‘base’和‘caller’。第一種調(diào)用格式的執(zhí)行機(jī)理當(dāng)‘workspace’取‘base’時(shí),表示計(jì)算eval(‘expression’)時(shí),將從基本工作(gōngzuò)空間中獲得變量值第三十八頁(yè),共62頁(yè)。當(dāng)‘workspace’取‘caller’時(shí),表示計(jì)算eval(‘expression’)時(shí),將從主調(diào)函數(shù)工作空間獲得變量值。主調(diào)函數(shù)是相對(duì)被調(diào)函數(shù)而言的。這里(zhèlǐ)被調(diào)函數(shù)是指evalin所在的函數(shù)。第二種調(diào)用格式的執(zhí)行機(jī)理是:先從所在函數(shù)空間獲取變量值,用eval(‘expression1’)計(jì)算原串表達(dá)式;如若該計(jì)算失敗,則再?gòu)摹畐orkspace’指定的(基本或主調(diào)函數(shù))工作空間獲取變量值,再通過(guò)eval(‘expression2’)計(jì)算替代串表達(dá)式。第三十九頁(yè),共62頁(yè)?!纠?1】本例演示:(A)編寫(xiě)繪制正多邊形或圓的程序。(B)子函數(shù)與(母)函數(shù)的關(guān)系。(C)各種(ɡèzhǒnɡ)不同的工作空間。(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第四十頁(yè),共62頁(yè)。(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
第四十一頁(yè),共62頁(yè)。2.跨空間賦值assignin(‘workspace’,’VN’,X)%跨空間向VN變量(biànliàng)賦值【例-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])第四十二頁(yè),共62頁(yè)。4.6串演算函數(shù)4.6.1evaly=eval(‘CEM’)%執(zhí)行CEM指定(zhǐdìng)的計(jì)算y=eval(‘CEM1’,‘CEM1’)%執(zhí)行CEM1指定(zhǐdìng)的計(jì)算,如果出錯(cuò),就執(zhí)行CEM2[y1,y2,…]=eval(‘CEM’)%執(zhí)行對(duì)CEM代表的函數(shù)文件調(diào)用,并輸出計(jì)算結(jié)果第四十三頁(yè),共62頁(yè)。說(shuō)明:Eval指令的輸入宗量必須是字符串構(gòu)成字符串的CEM,可以是MATLAB任何合法的指令、表達(dá)式、語(yǔ)句或M文件名。第3種格式(géshi)中的CEM只能是(包含輸入宗量在內(nèi)的)M函數(shù)文件名。第四十四頁(yè),共62頁(yè)?!纠?.6.1-1】計(jì)算(jìsuàn)“表達(dá)式”串,產(chǎn)生向量值。clear,t=pi;cem='[t/2,t*2,sin(t)]';y=eval(cem)第四十五頁(yè),共62頁(yè)?!纠?.6.1-2】計(jì)算(jìsuàn)“語(yǔ)句”串,創(chuàng)建變量。clear,t=pi;eval('theta=t/2,y=sin(theta)');who第四十六頁(yè),共62頁(yè)?!纠?.6.1-3】計(jì)算(jìsuàn)“替代”串。A=ones(2,1);B=ones(1,3);c=eval('B*A','A*B'),errmessage=lasterr第四十七頁(yè),共62頁(yè)?!纠?.6.1-4】計(jì)算(jìsuàn)“合成”串。CEM={'cos','sin','tan'};fork=1:3 theta=pi*k/12; y(1,k)=eval([CEM{1},'(',num2str(theta),')']);endy第四十八頁(yè),共62頁(yè)。4.6.2feval[y1,y2,…]=feval(‘FN’,arg1,arg2,…)%用參量arg1,arg2等執(zhí)行函數(shù)指定的計(jì)算說(shuō)明:‘FN’只能是函數(shù)名在既可以(kěyǐ)使用eval,又可以(kěyǐ)使用feval的情況下,feval運(yùn)行效率更高。第四十九頁(yè),共62頁(yè)?!纠?.6.2-1】feval和eval運(yùn)行區(qū)別(qūbié)之一:feval的FN絕對(duì)不能是表達(dá)式。x=pi/4;Ve=eval('1+sin(x)')Vf=feval('1+sin(x)',x)第五十頁(yè),共62頁(yè)?!纠?.6.2-2】feval和eval調(diào)用區(qū)別:feval的FN只接受函數(shù)(hánshù)名。本例兩種方法以后者為好。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])第五十一頁(yè),共62頁(yè)。4.6.3內(nèi)聯(lián)函數(shù)(hánshù)1.內(nèi)聯(lián)函數(shù)(hánshù)的創(chuàng)建inline(‘CE’)%把串表達(dá)式轉(zhuǎn)化為輸入宗量自動(dòng)生成的內(nèi)聯(lián)函數(shù)(hánshù)inline(‘CE’,arg1,arg2,…)%把串表達(dá)式轉(zhuǎn)化為arg1,arg2等指定輸入宗量的內(nèi)聯(lián)函數(shù)(hánshù)inline(‘CE’,n)%把串表達(dá)式轉(zhuǎn)化為x,P1,P2,…Pn等指定輸入宗量的內(nèi)聯(lián)函數(shù)(hánshù)第五十二頁(yè),共62頁(yè)。說(shuō)明:‘CE’是字符串;CE必須不包含賦值號(hào)“=”的表達(dá)(biǎodá)式。第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á)(biǎodá)得更自如。第三種調(diào)用格式最簡(jiǎn)練,但對(duì)輸入輸出宗量的字符限制嚴(yán)格。輸入宗量字符只能是x,P1,…Pn等。注意:P是大寫(xiě)字母。第五十三頁(yè),共62頁(yè)。2.涉及內(nèi)聯(lián)函數(shù)性質(zhì)的指令(zhǐlìng)class(inline_fun)%給出內(nèi)聯(lián)函數(shù)的類(lèi)型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ī)則第五十四頁(yè),共62頁(yè)。【例-1】演示:內(nèi)聯(lián)函數(shù)的第一種創(chuàng)建格式;使內(nèi)聯(lián)函數(shù)適于“數(shù)組運(yùn)算(yùnsuàn)”。clear,F1=inline('si
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版勞務(wù)外包合同范本
- 特許經(jīng)營(yíng)權(quán)授權(quán)合同
- 運(yùn)動(dòng)會(huì)商業(yè)贊助合約
- 就業(yè)意向協(xié)議書(shū)在職場(chǎng)中的應(yīng)用
- 匿名股東權(quán)益協(xié)議參考
- 2024年版全新國(guó)際貨物買(mǎi)賣(mài)合同
- 2024年專(zhuān)業(yè)委托加工協(xié)議書(shū)范本
- 天津市2024年臨時(shí)勞動(dòng)合同樣式
- 成品油物流合作協(xié)議模板
- 室內(nèi)裝潢設(shè)計(jì)合同案例
- 2024-2025學(xué)年第一學(xué)期初二物理期中考試卷
- 統(tǒng)編版2024-2025學(xué)年四年級(jí)語(yǔ)文上冊(cè)期中素養(yǎng)測(cè)評(píng)基礎(chǔ)卷 (含答案)
- 蘇教版九年級(jí)上冊(cè)勞動(dòng)技術(shù)+第21課+垃圾分類(lèi)與資源回收【課件】
- DB11T 1359-2016 平原生態(tài)公益林養(yǎng)護(hù)技術(shù)導(dǎo)則
- 預(yù)防校園欺凌主題班會(huì)課件(共36張課件)
- 公關(guān)服務(wù)合同
- 江蘇省蘇州市2024-2025學(xué)年七年級(jí)上學(xué)期期中數(shù)學(xué)摸底調(diào)研卷
- GB/T 44352-2024燃油蒸發(fā)排放系統(tǒng)用活性炭通用要求
- 2024山東濟(jì)南軌道交通集團(tuán)限公司招聘49人高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- “數(shù)字三品”應(yīng)用場(chǎng)景典型案例申報(bào)書(shū)
- 2024秋三年級(jí)語(yǔ)文上冊(cè)第二次月考達(dá)標(biāo)檢測(cè)卷第三四單元新人教版
評(píng)論
0/150
提交評(píng)論