《MATLAB程序設(shè)計(jì)基礎(chǔ)教程》課件第4章_第1頁(yè)
《MATLAB程序設(shè)計(jì)基礎(chǔ)教程》課件第4章_第2頁(yè)
《MATLAB程序設(shè)計(jì)基礎(chǔ)教程》課件第4章_第3頁(yè)
《MATLAB程序設(shè)計(jì)基礎(chǔ)教程》課件第4章_第4頁(yè)
《MATLAB程序設(shè)計(jì)基礎(chǔ)教程》課件第4章_第5頁(yè)
已閱讀5頁(yè),還剩130頁(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)介

第4章M腳本與M函數(shù)4.1使用M文件編程4.2M函數(shù)4.3函數(shù)的調(diào)用與函數(shù)句柄4.4函數(shù)編程的實(shí)例 4.1使用M文件編程

4.1.1M文件的結(jié)構(gòu)

1.函數(shù)M文件一個(gè)函數(shù)M文件與腳本文件類似,它們都是一個(gè)擴(kuò)展名為“.m”的文本文件。同腳本M文件一樣,函數(shù)M文件不進(jìn)入命令窗口,而是由文本編輯器所創(chuàng)建的外部文本文件。函數(shù)M文件不是獨(dú)立執(zhí)行的文件,它接受輸入?yún)?shù)、提供輸出參數(shù),只能被程序調(diào)用。一個(gè)函數(shù)M文件通常包含以下部分:

函數(shù)定義語(yǔ)句;

H1幫助行;

幫助文本;

函數(shù)體或者腳本文件語(yǔ)句;

注釋語(yǔ)句。為了易于理解,可以在書(shū)寫(xiě)代碼時(shí)添加注釋語(yǔ)句。這些注釋語(yǔ)句在編譯程序時(shí)會(huì)被忽略,因此不會(huì)影響編譯速度和程序運(yùn)行速度,但是能夠增加程序的可讀性。

一個(gè)完整的函數(shù)M文件的結(jié)構(gòu)如下:

functionf=fact(n) 函數(shù)定義語(yǔ)句

%Computeafactorialvalue. H1行

%FACT(N)returnsthefactorialofN, 幫助文本

%usuallydenotedbyN!

%Putsimply,FACT(N)isPROD(1:N). 注釋語(yǔ)句

f=prod(1:n); 函數(shù)體

函數(shù)定義語(yǔ)句只在函數(shù)文件中存在,定義函數(shù)名稱、輸入/輸出參數(shù)的數(shù)量和順序,腳本文件中沒(méi)有該語(yǔ)句。

2.腳本M文件

腳本文件也叫命令文件,是獨(dú)立執(zhí)行的文件,它不接受輸入?yún)?shù),不返回任何值,而是代碼的結(jié)合,該方法允許用戶將一系列MATLAB命令輸入到一個(gè)簡(jiǎn)單的腳本“.m”文件中,只要在MATLAB命令窗口中執(zhí)行該文件,則會(huì)依次執(zhí)行該文件中的命令。

腳本M文件中包含一族由MATLAB語(yǔ)言所支持的語(yǔ)句,它類似于DOS下的批處理文件,它的執(zhí)行方式很簡(jiǎn)單,用戶只需在MATLAB的提示符“>>”下鍵入該M文件的文件名,這樣MATLAB就會(huì)自動(dòng)執(zhí)行該M文件中的各條語(yǔ)句,并將結(jié)果直接返回到MATLAB的工作空間。在使用腳本文件時(shí)需要注意一點(diǎn):如果當(dāng)前工作區(qū)中存在與該腳本同名的變量,則當(dāng)輸入該文件名時(shí),系統(tǒng)將其作為變量名執(zhí)行。

MATLAB中有一個(gè)專門(mén)用于尋找“.m”文件的路徑搜索器?!?m”文件是以目錄和文件夾的方式分布于文件系統(tǒng)中的,一部分“.m”文件的目錄是MATLAB的子目錄,由于MATLAB的一切操作都是在它的搜索路徑,包括當(dāng)前路徑中進(jìn)行的,因此如果調(diào)用的函數(shù)在搜索路徑之外,MATLAB就會(huì)認(rèn)為此函數(shù)不存在。

3.塊注釋

在MATLAB?5以前的版本中,注釋是逐行進(jìn)行的,采用百分號(hào)(%)進(jìn)行標(biāo)記。逐行注釋不利于用戶增加和修改注釋內(nèi)容。在MATLAB?5及以后的版本中,用戶可以使用“%{”和“%}”符號(hào)進(jìn)行塊注釋,“%{”和“%}”分別代表注釋塊的起始和結(jié)束。

4.代碼單元

一個(gè)代碼單元指用戶在M文件中指定的一段代碼,以一個(gè)代碼單元符號(hào):兩個(gè)百分號(hào)加空格,即“%%”為開(kāi)始標(biāo)志,到另一個(gè)代碼單元符號(hào)結(jié)束。如果不存在代碼單元符號(hào),則直到該文件結(jié)束。用戶可以通過(guò)MATLAB編輯器中的cell菜單創(chuàng)建和管理代碼單元。

需要注意的是,代碼單元只能在MATLAB編輯器窗口中創(chuàng)建和使用,而在MATLAB命令窗口中是無(wú)效的。當(dāng)在命令窗口中運(yùn)行M文件時(shí),將執(zhí)行文件中的全部語(yǔ)句。4.1.2M文件的建立、運(yùn)行與命名規(guī)則

M文件的語(yǔ)法類似于一般高級(jí)語(yǔ)言,是一種程序化的編程語(yǔ)言,但是與傳統(tǒng)的高級(jí)語(yǔ)言相比,M文件又有其特點(diǎn)。它只是一個(gè)簡(jiǎn)單的ASCII碼型文本文件,因此,它的語(yǔ)法比一般的高級(jí)語(yǔ)言要簡(jiǎn)單,程序也容易調(diào)試,并具有很好的交互性。

1.M文件的建立與運(yùn)行

M文件的建立與運(yùn)行都可以在M文本編輯器中進(jìn)行。在MATLAB主窗口中,單擊菜單命令“File?|?New?|?Script”或“Function”即可打開(kāi)M文本編輯器,如圖4-1所示。

輸入完程序命令代碼后,按照M文件的命名規(guī)則對(duì)文件進(jìn)行命名并保存。

單擊菜單命令“Debug?|?Run”或“F5”即可運(yùn)行腳本程序。M函數(shù)程序的運(yùn)行需要由其他程序調(diào)用。圖4-1M文本編輯器

2.M文件的命名規(guī)則

M文件的命名規(guī)則如下:

(1)文件名命名要用英文字符,第一個(gè)字符必須是字母而不能是數(shù)字,其中間不能有非法字符。

(2)文件名不要取為MATLAB的固有函數(shù),盡量不要是簡(jiǎn)單的英文單詞,最好是由大小寫(xiě)英文、數(shù)字、下劃線等組合而成的。原因是簡(jiǎn)單的單詞命名容易與內(nèi)部函數(shù)名同名,結(jié)果會(huì)出現(xiàn)一些莫名其妙的錯(cuò)誤。

(3)文件存儲(chǔ)路徑一定要為英文。

(4)文件名不能為兩個(gè)單詞,如randomwalk,應(yīng)該寫(xiě)成random_walk,即中間不能有空格等非法字符。4.1.3程序的調(diào)試

在開(kāi)發(fā)函數(shù)或M文件過(guò)程中,會(huì)不可避免地出現(xiàn)錯(cuò)誤,即運(yùn)行故障。MATLAB提供了很多函數(shù)和方法,來(lái)幫助調(diào)試函數(shù)或腳本程序。

在MATLAB的M文本編輯器窗口中,單擊菜單命令“Debug|SaveFileandRun”,即可運(yùn)行M文本編輯器中的內(nèi)容。

在MATLAB表達(dá)式中,有兩類錯(cuò)誤:語(yǔ)法錯(cuò)誤和運(yùn)行錯(cuò)誤。在運(yùn)行過(guò)程中,可能存在一些語(yǔ)法或其他錯(cuò)誤而自動(dòng)終止執(zhí)行,而需要進(jìn)行類似于修正錯(cuò)誤或更改參數(shù)的調(diào)試。

當(dāng)MATLAB計(jì)算一個(gè)表達(dá)式的值或一個(gè)函數(shù)被編譯到內(nèi)存時(shí)會(huì)發(fā)現(xiàn)語(yǔ)法錯(cuò)誤。一旦發(fā)現(xiàn)語(yǔ)法錯(cuò)誤,MATLAB立即標(biāo)志這些錯(cuò)誤,并提供有關(guān)所遇到的錯(cuò)誤類型,以及M文件中發(fā)生錯(cuò)誤處的行數(shù)。給定這些反饋信息后,就很容易糾正這些錯(cuò)誤。而另一方面,即使MATLAB標(biāo)志了運(yùn)行錯(cuò)誤,但找出錯(cuò)誤一般比較困難。當(dāng)發(fā)現(xiàn)運(yùn)行錯(cuò)誤時(shí),MATLAB把控制權(quán)返回給命令窗口和MATLAB的工作空間,失去了對(duì)發(fā)生錯(cuò)誤的函數(shù)空間的訪問(wèn)權(quán),因此用戶不能詢問(wèn)函數(shù)工作空間中的內(nèi)容排除問(wèn)題。

MATLAB程序的調(diào)試一般使用兩種方法:直接調(diào)試法和利用調(diào)試工具。

1.直接調(diào)試法

MATLAB語(yǔ)言具有強(qiáng)大的運(yùn)算能力,指令系統(tǒng)簡(jiǎn)單,因此程序通常非常簡(jiǎn)潔。對(duì)于簡(jiǎn)單的程序可以采用直接調(diào)試的方法。

在程序調(diào)試時(shí),程序運(yùn)行中變量的值為一個(gè)重要的線索。由于在函數(shù)調(diào)用時(shí)只返回最后的輸出參數(shù),而不返回中間變量,因此,可以選擇下面的方法查看程序運(yùn)行中的變量值。

(1)通過(guò)分析后,將可能出錯(cuò)的語(yǔ)句后面的分號(hào)(;)刪除,將結(jié)果顯示在命令窗口中,與預(yù)期值進(jìn)行比較。

(2)利用函數(shù)disp()顯示中間變量的值。

(3)在程序中的適當(dāng)位置添加keyboard指令。程序運(yùn)行至此時(shí)將暫停,在命令窗口中顯示k>>提示符,用戶可以查看工作區(qū)中的變量,可以改變變量的值。輸入return指定返回程序,繼續(xù)運(yùn)行。

(4)在調(diào)試一個(gè)單獨(dú)的函數(shù)時(shí),可以將函數(shù)改寫(xiě)為腳本文件,此時(shí)可以直接對(duì)輸入?yún)?shù)賦值,然后以腳本方式運(yùn)行該M文件,這樣可以保存中間變量,在運(yùn)行完成后,可以查看中間變量的值,對(duì)結(jié)果進(jìn)行分析,查找錯(cuò)誤所在。

2.利用調(diào)試工具

可采用的調(diào)試工具有命令行調(diào)試程序和調(diào)試器界面調(diào)試程序。

文本編輯器中的Debug菜單提供了全部的調(diào)試選項(xiàng),另外,MATLAB主窗口中的Debug菜單提供了一些調(diào)試命令,方便調(diào)試時(shí)在命令窗口中查看運(yùn)行狀態(tài)。調(diào)試選項(xiàng)及其功能如表4-1所示。表4-1調(diào)?試?菜?單?項(xiàng)

Set/ClearBreakpoint:設(shè)置或清除斷點(diǎn)??梢赃x擇該選項(xiàng)對(duì)當(dāng)前行進(jìn)行操作,或者通過(guò)快捷鍵F12,或者直接點(diǎn)擊該行左側(cè)的“-”。設(shè)置斷點(diǎn)時(shí)該處顯示為紅點(diǎn)。再次進(jìn)行相同的操作則刪除該斷點(diǎn)。

一旦這些斷點(diǎn)被設(shè)置,程序?qū)?huì)運(yùn)行到第一個(gè)斷點(diǎn)并在那里停止。在調(diào)試的過(guò)程中,會(huì)有一個(gè)綠色的箭頭出現(xiàn)在當(dāng)前行。

一旦到達(dá)某個(gè)斷點(diǎn),程序員可以通過(guò)在命令窗口中鍵入變量名的方法檢查或修改在工作區(qū)內(nèi)的任一變量。當(dāng)程序員對(duì)程序的這一點(diǎn)感到滿意時(shí),可以通過(guò)重復(fù)按F10鍵一行一行地進(jìn)行調(diào)試,也可以按F5鍵運(yùn)行到下一個(gè)斷點(diǎn)。它總是能檢測(cè)程序中的每一個(gè)斷點(diǎn)中的任何一個(gè)變量的值。

Set/ModifyConditionalBreakpoint…:該選項(xiàng)用于設(shè)置或修改條件斷點(diǎn)。條件斷點(diǎn)為一種特殊的斷點(diǎn),當(dāng)滿足指定的條件時(shí)則程序執(zhí)行至此即停止,條件不滿足時(shí)則程序繼續(xù)進(jìn)行。其設(shè)置界面如圖4-2所示,在輸入框中輸入斷點(diǎn)條件則將當(dāng)前行設(shè)置為條件斷點(diǎn)。圖4-2設(shè)置或修改條件斷點(diǎn)對(duì)話框

Enable/DisableBreakpoint:該選項(xiàng)用于開(kāi)啟或關(guān)閉當(dāng)前行的斷點(diǎn),如果當(dāng)前行不存在斷點(diǎn),則設(shè)置當(dāng)前行為斷點(diǎn);如果當(dāng)前行是斷點(diǎn),則改變?cè)摂帱c(diǎn)的狀態(tài)。在調(diào)試時(shí),被關(guān)閉的斷點(diǎn)將會(huì)被忽略。

在程序調(diào)試中,變量的值是查找錯(cuò)誤的重要線索,在MATLAB中有三種查看變量值的方法:

(1)在編輯器中將鼠標(biāo)放置在待查看的變量處停留,則在此處顯示該變量的值;

(2)在工作區(qū)瀏覽器中查看該變量的值;

(3)在命令窗口中輸入該變量的變量名,則顯示該變量的值。調(diào)試器的另外一個(gè)重要特性是可在“Debug”菜單的“StopifErrors/Warnings”項(xiàng)目中找到錯(cuò)誤。如果程序中發(fā)生了一個(gè)錯(cuò)誤,這個(gè)錯(cuò)誤導(dǎo)致了電腦死機(jī)或產(chǎn)生了錯(cuò)誤信息,程序員可以打開(kāi)這些選項(xiàng),并執(zhí)行這個(gè)程序。這個(gè)程序?qū)?huì)運(yùn)行到錯(cuò)誤或警告的斷點(diǎn)并停在那兒,它允許程序員檢查變量的每一個(gè)值,并幫助找出出錯(cuò)的原因。若一個(gè)錯(cuò)誤被發(fā)現(xiàn),程序員能用編輯器來(lái)更正這個(gè)MALTAB程序,并把更新的版本存到磁盤(pán)上,在調(diào)試沒(méi)結(jié)束之前,它必須重復(fù)以上的動(dòng)作。這個(gè)步驟將會(huì)重復(fù)下去直到這個(gè)程序沒(méi)有錯(cuò)誤出現(xiàn)。4.1.4程序錯(cuò)誤的檢測(cè)和處理

在MATLAB的命令表達(dá)式中可能存在兩種類型的錯(cuò)誤,即語(yǔ)法錯(cuò)誤和運(yùn)行錯(cuò)誤。

語(yǔ)法錯(cuò)誤。語(yǔ)法錯(cuò)誤發(fā)生在M文件程序代碼的生成過(guò)程中,一般是由于編程人員的錯(cuò)誤操作引起的,常見(jiàn)的如變量或函數(shù)名拼寫(xiě)錯(cuò)誤、引號(hào)或括號(hào)以及標(biāo)點(diǎn)符號(hào)缺少或應(yīng)用不當(dāng),也可能是由函數(shù)參數(shù)輸入類型有誤或是矩陣運(yùn)算階數(shù)不符等所引起的。

運(yùn)行錯(cuò)誤。運(yùn)行錯(cuò)誤一般指在程序運(yùn)行過(guò)程中,出現(xiàn)溢出或是死循環(huán)等異?,F(xiàn)象。

1.錯(cuò)誤的檢測(cè)

在編程過(guò)程中,無(wú)論程序的編寫(xiě)多么謹(jǐn)慎,在不同的環(huán)境下運(yùn)行時(shí)都有可能產(chǎn)生意外的錯(cuò)誤。因此,有必要在程序中添加錯(cuò)誤檢測(cè)語(yǔ)句,保證程序在所有的條件下都能夠正常運(yùn)行。

1)錯(cuò)誤檢測(cè)

與C語(yǔ)言類似,MATLAB中的try-catch語(yǔ)句可用于錯(cuò)誤檢測(cè)。如果程序中的一些語(yǔ)句可能會(huì)產(chǎn)生非預(yù)計(jì)的結(jié)果,可以將這些語(yǔ)句放在try-catch塊中。try-catch語(yǔ)句可以檢測(cè)所有錯(cuò)誤,并且分別進(jìn)行處理。格式如下:

try

表達(dá)式1

catch

表達(dá)式2

end

一個(gè)try-catch塊分為兩部分。第一部分以try開(kāi)始,第二部分以catch開(kāi)始,整個(gè)塊以end結(jié)束。程序首先正常執(zhí)行第一部分,如果有錯(cuò)誤發(fā)生,則停止執(zhí)行該部分的其他語(yǔ)句,轉(zhuǎn)而執(zhí)行catch中的語(yǔ)句。catch部分對(duì)錯(cuò)誤進(jìn)行處理,可以顯示錯(cuò)誤提示、執(zhí)行默認(rèn)語(yǔ)句等。在try-catch語(yǔ)句中,可以嵌套其他的try-catch語(yǔ)句,其格式如下:

try

表達(dá)式1 %執(zhí)行表達(dá)式1

catch

try

表達(dá)式2 %嘗試從錯(cuò)誤中恢復(fù)

catch

disp'Operationfailed' %處理錯(cuò)誤

end

end

2)發(fā)出錯(cuò)誤報(bào)告

在MATALB中,error()函數(shù)可以報(bào)告錯(cuò)誤并且中斷程序運(yùn)行。用戶可以通過(guò)指定error()函數(shù)參數(shù)的方式指定將要發(fā)出的錯(cuò)誤信息。MATALB提供了一系列錯(cuò)誤識(shí)別和處理函數(shù),如表4-2所示。

3)識(shí)別錯(cuò)誤發(fā)生的原因

當(dāng)錯(cuò)誤發(fā)生時(shí),用戶需要知道錯(cuò)誤發(fā)生的位置及錯(cuò)誤原因,以便能夠正確處理錯(cuò)誤。lasterror()函數(shù)可以返回最后發(fā)生的錯(cuò)誤的相關(guān)信息,輔助用戶識(shí)別錯(cuò)誤。

lasterror()函數(shù)的返回結(jié)果為一個(gè)結(jié)構(gòu)體,該結(jié)構(gòu)體包含三個(gè)域,分別為message、identifier、stack。message為字符串,其內(nèi)容為最近發(fā)生的錯(cuò)誤的相關(guān)文本信息;identifier也是一個(gè)字符串,其內(nèi)容為錯(cuò)誤消息的類別標(biāo)志;stack為一結(jié)構(gòu)體,其內(nèi)容為該錯(cuò)誤的堆棧中的相關(guān)信息。stack包含三個(gè)域,分別為file、name和line,表示文件名、函數(shù)名和錯(cuò)誤發(fā)生的行數(shù)。

4)錯(cuò)誤重現(xiàn)

在一些情況下,需要重現(xiàn)已經(jīng)拋出過(guò)的錯(cuò)誤,以便于對(duì)錯(cuò)誤進(jìn)行分析,函數(shù)rethrow()可以重新拋出指定的錯(cuò)誤。

該函數(shù)的格式為rethrow(err),其中,輸入?yún)?shù)err用于指定需要重現(xiàn)的錯(cuò)誤,err必須為MATLAB結(jié)構(gòu)體,包含message、identifier、stack中至少一個(gè)域,這三個(gè)域的類型與lasterror返回結(jié)果相同。

該語(yǔ)句執(zhí)行后程序運(yùn)行中斷,將控制權(quán)轉(zhuǎn)給鍵盤(pán)或catch語(yǔ)句的上一層模塊。

rethrow()函數(shù)通常與try-catch語(yǔ)句一起使用,如:

try

表達(dá)式1

catch

do_cleanup

rethrow(lasterror)

end

2.標(biāo)志符的應(yīng)用

1)消息標(biāo)志符的格式

消息標(biāo)志符為一個(gè)字符串,指定錯(cuò)誤或警告消息的類別(component)及詳細(xì)信息(mnemonic)。通常為“類別:詳細(xì)信息”的格式。如:

MATLAB:divideByZero

Simulink:actionNotTaken

TechCorp:notFoundInPath

兩個(gè)部分都需要滿足如下的規(guī)則:

(1)不能包含空格;

(2)第一個(gè)字符必須為字母;

(3)后面的字符可以為數(shù)字或下劃線。類別部分指定錯(cuò)誤或警告可能發(fā)生的大體位置,通常為某一產(chǎn)品的名字或者工具箱的名字,如MATLAB或者Control。MATLAB支持使用多層次的類別名稱。

詳細(xì)信息用于指定消息的具體內(nèi)容,如除數(shù)為0等。

以下例子為一個(gè)完整的標(biāo)志符:

error('MATLAB:ambiguousSyntax','Syntax%scouldbeambiguous.\n',inputstr)。

2)消息標(biāo)志符的應(yīng)用

消息標(biāo)志符通常與lasterror()函數(shù)一起應(yīng)用,使得lasterror()函數(shù)和lasterr()函數(shù)能夠識(shí)別錯(cuò)誤的原因。lasterror()函數(shù)和lasterr()函數(shù)返回消息標(biāo)志符,用戶可以通過(guò)其類別信息和詳細(xì)信息分別獲取錯(cuò)誤的總體類別及具體信息。

使用消息標(biāo)志符的第一步為確定目的信息并為其指定標(biāo)志符。消息標(biāo)志符通過(guò)error()函數(shù)指定,格式如下:

error('msg_id','errormsg')

error('msg_id','formatted_errormsg',arg1,arg2,...)

其中的消息標(biāo)志符可以省略。如果lasterror()函數(shù)不使用該信息,上面的語(yǔ)句可以簡(jiǎn)寫(xiě)為

error('errormsg')

3.錯(cuò)誤處理

對(duì)于執(zhí)行出現(xiàn)的錯(cuò)誤,可以根據(jù)提示的錯(cuò)誤類型,有針對(duì)性地改正,然后繼續(xù)編譯、運(yùn)行。如果程序較大,可以像C語(yǔ)言一樣設(shè)置斷點(diǎn)、單步執(zhí)行等。MATALB提供了一系列程序斷點(diǎn)的設(shè)置函數(shù),如表4-3所示。

4.警告處理

警告用于提示用戶在程序運(yùn)行中出現(xiàn)異常情況。與錯(cuò)誤不同的是,警告并不中斷程序的運(yùn)行,而是顯示警告內(nèi)容并繼續(xù)執(zhí)行。警告通過(guò)函數(shù)warning()發(fā)出,格式與error()函數(shù)相同,如:

warning('Inputmustbeastring')

warning('formatted_warningmsg',arg1,arg2,...)

warning('Ambiguousparametername,"%s".',param)

另外,與錯(cuò)誤相同,警告也可以使用消息標(biāo)志符,用以顯示該警告信息的類別及具體信息。

5.函數(shù)M文件中的錯(cuò)誤處理

函數(shù)M文件中的一般錯(cuò)誤處理與腳本文件一樣,但對(duì)于函數(shù)M文件中出現(xiàn)的簡(jiǎn)單問(wèn)題,使用下面的一種或幾種方法可以方便求解。

(1)將函數(shù)中輸出關(guān)鍵值的行的分號(hào)(;)去掉,這樣,這些運(yùn)算的中間結(jié)果將在命令窗口中予以顯示,用戶可以據(jù)此來(lái)檢查中間結(jié)果的正確性。

(2)在函數(shù)中添加一些語(yǔ)句,用來(lái)顯示用戶認(rèn)為很重要的變量的值。

(3)使用keyboard命令中斷程序,該命令實(shí)現(xiàn)函數(shù)工作區(qū)間和命令窗口工作區(qū)間的交互,從而獲得用戶所需要的信息,使用該命令后,程序?qū)⑻幱谡{(diào)試狀態(tài),此時(shí)命令窗口的提示符由“>>”變?yōu)椤癒>>”,用戶可以進(jìn)行相應(yīng)的操作。

(4)在函數(shù)頭前加“%”就將函數(shù)式M文件變?yōu)槟_本式M文件,而腳本式M文件運(yùn)行時(shí),其工作區(qū)間就是MATLAB的工作區(qū)間,這樣在出現(xiàn)錯(cuò)誤的時(shí)候就可以查詢這個(gè)工作區(qū)間。

當(dāng)M文件大,遞歸調(diào)用或者多次嵌套(即調(diào)用其他M文件函數(shù),被調(diào)用M文件函數(shù)又調(diào)用其他M文件函數(shù),等等)時(shí),用MATLAB的調(diào)試函數(shù)會(huì)更方便。與上述所列方法相反,這些調(diào)試函數(shù)不要求將有問(wèn)題的M文件進(jìn)行編輯。表3-6所給出的這些函數(shù)類似于其他高級(jí)編程語(yǔ)言中所提供的函數(shù)。4.1.5程序的分析與優(yōu)化

在MATLAB中,使用profile()函數(shù)以及計(jì)時(shí)函數(shù)tic()和toc()來(lái)分析程序中各個(gè)部分的耗時(shí)情況,從而幫助用戶找出程序中需要改進(jìn)的地方。其中profile()在計(jì)算相對(duì)耗時(shí)以及查找文件執(zhí)行過(guò)程中瓶頸問(wèn)題時(shí)更為有效,而tic()和toc()函數(shù)在計(jì)算絕對(duì)耗時(shí)時(shí)更為有效。

1.通過(guò)tic()、toc()函數(shù)進(jìn)行程序運(yùn)行分析

如果只需要了解程序的運(yùn)行時(shí)間,或者比較一段程序在不同應(yīng)用條件下的運(yùn)行速度,可以通過(guò)計(jì)時(shí)器來(lái)進(jìn)行。計(jì)時(shí)器包含tic()和toc()兩個(gè)函數(shù)。tic()用于開(kāi)始計(jì)時(shí)器,toc()用于關(guān)閉計(jì)時(shí)器,并計(jì)算程序運(yùn)行的總時(shí)間。如:

tic

所需計(jì)時(shí)的程序代碼--

toc

對(duì)于小程序,如果其運(yùn)行時(shí)間非常短,可以通過(guò)將其多次運(yùn)行,計(jì)算總體時(shí)間的方法進(jìn)行,如:

tic

fork=1:100

所需計(jì)時(shí)的程序代碼--

end

toc因?yàn)镸ATLAB是一種解釋性語(yǔ)言,所以有時(shí)程序的執(zhí)行速度不是很理想。一個(gè)目的的實(shí)現(xiàn),往往可以有多種程序結(jié)構(gòu)或算法,或使用不同的函數(shù)。而不同的方法,其速度是千差萬(wàn)別的,例如求解定積分的數(shù)值解法在MATLAB中就提供了quad()和quadl()兩個(gè)函數(shù),其中后一個(gè)算法在精度、速度上都明顯高于前一種方法。所以說(shuō),在科學(xué)計(jì)算領(lǐng)域是存在“多快好省”的途徑的。因此可以通過(guò)程序的優(yōu)化,使編程、運(yùn)行效率提高。

2.循環(huán)運(yùn)算的優(yōu)化

循環(huán)運(yùn)算是MATLAB中的最大弱點(diǎn)。在程序設(shè)計(jì)中,循環(huán)語(yǔ)句及循環(huán)體經(jīng)常被認(rèn)為是MATLAB編程的瓶頸問(wèn)題,應(yīng)當(dāng)盡量避免使用循環(huán)運(yùn)算。如果必須使用循環(huán)運(yùn)算,可通過(guò)以下兩種方法進(jìn)行改進(jìn),以提高其效率。

(1)程序的向量化操作,使循環(huán)向量化:當(dāng)使用for循環(huán)和while循環(huán)來(lái)增加數(shù)據(jù)結(jié)構(gòu)的大小時(shí),將影響系統(tǒng)和內(nèi)存的使用。提高效率的可行辦法是進(jìn)行預(yù)定義。

用戶可以通過(guò)將M文件向量化來(lái)優(yōu)化M文件。所謂向量化,就是使用向量和矩陣運(yùn)算來(lái)代替For循環(huán)和While循環(huán)。采取向量化的方法比常規(guī)循環(huán)運(yùn)算效率可提高一倍多。

(2)在必須使用多重循環(huán)的情況下,如果兩個(gè)循環(huán)執(zhí)行的次數(shù)不同,則建議在循環(huán)的外環(huán)執(zhí)行循環(huán)次數(shù)少的,內(nèi)環(huán)執(zhí)行循環(huán)次數(shù)多的,這樣也可以顯著提高速度。

3.大型矩陣(數(shù)組)預(yù)先定維、預(yù)分配內(nèi)存

雖然矩陣的尺寸不必預(yù)先定義,但給大型矩陣動(dòng)態(tài)定維是個(gè)很耗費(fèi)時(shí)間的事。如果在定義大矩陣時(shí),首先用MATLAB函數(shù),如zeros()或ones()對(duì)之預(yù)先進(jìn)行定維、預(yù)分配內(nèi)存,然后再進(jìn)行賦值處理,這樣會(huì)顯著減少所需的時(shí)間,大大提高效率。

4.優(yōu)化程序結(jié)構(gòu)

優(yōu)化程序結(jié)構(gòu)需要考慮以下因素:

(1)優(yōu)先考慮內(nèi)在函數(shù)。由于MATLAB的內(nèi)在函數(shù)是由更底層的C語(yǔ)言編程構(gòu)造的,其執(zhí)行速度顯然快于使用循環(huán)的矩陣運(yùn)算,因此矩陣運(yùn)算應(yīng)該盡量采用MATLAB的內(nèi)在函數(shù)。

(2)采用有效的算法。在實(shí)際應(yīng)用中,解決同樣的數(shù)學(xué)問(wèn)題經(jīng)常有各種各樣的算法。如果一個(gè)方法不能滿足要求,可以嘗試其他的方法。

(3)避免在運(yùn)行MATLAB時(shí)運(yùn)行其他大型后臺(tái)程序。

(4)對(duì)向量賦值時(shí)盡量避免改變變量的類型或數(shù)組大小。

(5)盡量對(duì)實(shí)數(shù)進(jìn)行操作,避免復(fù)數(shù)的操作。

(6)合理使用邏輯運(yùn)算符。

(7)避免重載MATLAB的內(nèi)置函數(shù)和操作符。

(8)通常情況下,函數(shù)的運(yùn)行效率高于腳本文件。

(9)?load()和save()函數(shù)效率高于文件輸入/輸出函數(shù)。

5.應(yīng)用Mex技術(shù)

應(yīng)用Mex技術(shù),以Mex文件的格式編寫(xiě)循環(huán)語(yǔ)句。在一個(gè)大型的MATLAB程序中,雖然采用了很多措施,但執(zhí)行速度仍然很慢,比如說(shuō)耗時(shí)的循環(huán)是不可避免的,這樣就應(yīng)該考慮用其他語(yǔ)言,如C或Fortran語(yǔ)言。按照Mex技術(shù)要求的格式編寫(xiě)相應(yīng)部分的程序,然后通過(guò)編譯連接,形成在MATLAB可以直接調(diào)用的動(dòng)態(tài)連接庫(kù)(DLL)文件,這樣可以顯著地加快運(yùn)算速度。 4.2M函數(shù)

函數(shù)是MATLAB強(qiáng)有力的工具,在求解一些大的問(wèn)題時(shí),會(huì)經(jīng)常使用到一些已經(jīng)定義的數(shù)學(xué)函數(shù)、系統(tǒng)函數(shù)、其他函數(shù)或有用的命令序列等。MATLAB中提供了兩種函數(shù)表示的方法:

利用M文件將函數(shù)定義為MALTAB函數(shù)。MATLAB提供了一個(gè)創(chuàng)建用戶自定義函數(shù)的結(jié)構(gòu),并以M文件的文本形式存儲(chǔ)在計(jì)算機(jī)上。

匿名函數(shù)方法。通過(guò)符號(hào)“@”直接創(chuàng)建函數(shù)。4.2.1函數(shù)M文件

函數(shù)M文件與腳本文件M文件在通信方面是不同的。函數(shù)是一個(gè)黑箱,使用函數(shù)時(shí),可以看見(jiàn)的就是輸入數(shù)據(jù)和輸出數(shù)據(jù)。函數(shù)與MATLAB工作空間之間的通信,只通過(guò)傳遞給它的變量和通過(guò)它所創(chuàng)建的輸出變量。在函數(shù)內(nèi)中間變量不出現(xiàn)在MATLAB工作空間,或與MATLAB工作空間不交互。

MATLAB頭一次執(zhí)行一個(gè)函數(shù)M文件時(shí),它打開(kāi)相應(yīng)的文本文件并將命令編輯成存儲(chǔ)器的內(nèi)部表示,以加速執(zhí)行在以后所有的調(diào)用。如果函數(shù)包含了對(duì)其他函數(shù)M文件的引用,它們也同樣被編譯到存儲(chǔ)器。而普通的腳本M文件不被編譯,即使它們是從函數(shù)M文件內(nèi)調(diào)用,也是如此。打開(kāi)腳本M文件,調(diào)用一次就逐行進(jìn)行注釋。

函數(shù)M文件提供了一個(gè)簡(jiǎn)單的擴(kuò)展MATLAB功能的方法。事實(shí)上,MATLAB本身的許多標(biāo)準(zhǔn)函數(shù)就是函數(shù)M文件。4.2.2函數(shù)M文件的結(jié)構(gòu)、規(guī)則和屬性

一個(gè)函數(shù)M文件通常包含五個(gè)部分:函數(shù)定義語(yǔ)句、H1幫助行、幫助文本、函數(shù)體或者腳本文件語(yǔ)句和注釋語(yǔ)句。函數(shù)M文件必須遵循以下特定的規(guī)則。除此之外,它們還有許多的重要屬性。

1.函數(shù)定義

函數(shù)定義必須遵循以下特定的規(guī)則:

(1)一個(gè)函數(shù)M文件的第一行使用function把M文件定義為一個(gè)函數(shù),并指定它的名字。

(2)函數(shù)名和文件名必須相同,但沒(méi)有?.m擴(kuò)展名。例如,函數(shù)fliplr()存儲(chǔ)在名為fliplr.m文件中。它也定義了它的輸入和輸出變量。

2.輸入、輸出參量

函數(shù)可以有零個(gè)或更多個(gè)輸入?yún)⒘?,也可以有零個(gè)或更多個(gè)輸出參量。

函數(shù)可以按少于函數(shù)M文件中所規(guī)定的輸入和輸出變量進(jìn)行調(diào)用,但不能用多于函數(shù)M文件中所規(guī)定的輸入和輸出變量數(shù)目。如果輸入和輸出變量數(shù)目多于函數(shù)M文件中function語(yǔ)句一開(kāi)始所規(guī)定的數(shù)目,則調(diào)用時(shí)自動(dòng)返回一個(gè)錯(cuò)誤。

當(dāng)函數(shù)有一個(gè)以上輸出變量時(shí),輸出變量包含在括號(hào)內(nèi)。

例如:[V,D]=eig(A)。

3.幫助行

正文的第一行是幫助行,稱為H1行,H1行是緊隨函數(shù)定義語(yǔ)句后面的一行注釋語(yǔ)句,是由lookfor命令所搜索的行,lookfor()函數(shù)只檢索和顯示H1行。

H1行后面連續(xù)的注釋行是幫助文本,當(dāng)在命令窗口中通過(guò)help命令查詢?cè)摵瘮?shù)的說(shuō)明信息時(shí),則在窗口中顯示這些內(nèi)容。

M文件的其余部分包含了MATLAB創(chuàng)建輸出變量的命令。

4.函數(shù)體

函數(shù)體為M文件的主要部分,是函數(shù)的執(zhí)行代碼。

除上面的H1行和幫助文本外,為了易于理解,可以在書(shū)寫(xiě)代碼時(shí)添加注釋語(yǔ)句。這些注釋語(yǔ)句在編譯程序時(shí)會(huì)被忽略,因此不會(huì)影響編譯速度和程序運(yùn)行速度,但是能夠增加程序的可讀性。

5.函數(shù)的工作空間

(1)函數(shù)有它們自己的專用工作空間,與MATLAB的工作空間是分開(kāi)的。函數(shù)內(nèi)變量與MATLAB工作空間之間唯一的聯(lián)系是函數(shù)的輸入和輸出變量。如果函數(shù)任一輸入變量值發(fā)生變化,其變化僅在函數(shù)內(nèi)出現(xiàn),不影響MATLAB工作空間的變量。函數(shù)內(nèi)所創(chuàng)建的變量只駐留在函數(shù)的工作空間,而且只在函數(shù)執(zhí)行期間臨時(shí)存在,以后就消失。因此,從一個(gè)調(diào)用到下一個(gè)調(diào)用,在函數(shù)工作空間變量存儲(chǔ)信息是不可能的。

(2)如果一個(gè)預(yù)定的變量(如pi)在MATLAB工作空間被重新定義,它不會(huì)延伸到函數(shù)的工作空間。逆向有同樣的屬性,即函數(shù)內(nèi)的重新定義變量不會(huì)延伸到MATLAB的工作空間中。

(3)當(dāng)調(diào)用一個(gè)函數(shù)時(shí),輸入變量不會(huì)拷貝到函數(shù)的工作空間,但它們的值在函數(shù)內(nèi)可讀。然而,只要改變輸入變量?jī)?nèi)的任何值,數(shù)組就可拷貝到函數(shù)工作空間。進(jìn)而,按缺省,如果輸出變量與輸入變量相同,例如,如果函數(shù)是x=fun(x,y,z)中的x,那么就將它拷貝到函數(shù)的工作空間。因此,為了節(jié)約存儲(chǔ)和增加速度,最好是從大數(shù)組中抽取元素,然后對(duì)它們作修正,而不是使整個(gè)數(shù)組拷貝到函數(shù)的工作空間。4.2.3函數(shù)變量

MATLAB的變量有輸入變量、輸出變量和函數(shù)內(nèi)使用的變量之分,還可分為局部變量、全局變量、永久變量。

輸入變量相當(dāng)于函數(shù)的入口數(shù)據(jù),也是一個(gè)函數(shù)操作的主要對(duì)象,從某種意義上來(lái)說(shuō),函數(shù)的功能就是對(duì)輸入變量進(jìn)行一定的操作,從而實(shí)現(xiàn)一定的功能。函數(shù)的輸入變量為局部變量,函數(shù)對(duì)輸入變量的一切操作和修改如果不依靠輸出變量的話,將不會(huì)影響工作區(qū)間中該變量的值。

1.局部變量

在M函數(shù)文件中,所有變量默認(rèn)為局部變量。因此,在一個(gè)函數(shù)文件中的變量與MATLAB工作區(qū)中的同名變量是完全不同的變量,它們存在內(nèi)存的不同位置。

每個(gè)函數(shù)都有自己的局部變量,這些變量存儲(chǔ)在該函數(shù)獨(dú)立的工作區(qū)中,與其他函數(shù)的變量及主工作區(qū)中的變量分開(kāi)存儲(chǔ)。當(dāng)函數(shù)調(diào)用結(jié)束時(shí),這些變量隨之刪除,不保存在內(nèi)存中。并且,除了函數(shù)返回值,該函數(shù)不改變工作區(qū)中其他變量的值。

腳本文件沒(méi)有獨(dú)立的工作區(qū),當(dāng)通過(guò)命令窗口調(diào)用腳本文件時(shí),腳本文件分享主工作區(qū),當(dāng)函數(shù)調(diào)用腳本文件時(shí),腳本文件分享主調(diào)函數(shù)的工作區(qū)。需要注意的是,如果腳本中改變了工作區(qū)中變量的值,則在腳本文件調(diào)用結(jié)束后,該變量的值發(fā)生改變。局部變量是在函數(shù)內(nèi)部使用的變量,其影響范圍只能在本函數(shù)內(nèi),每個(gè)函數(shù)在運(yùn)行時(shí),都占有獨(dú)立的函數(shù)工作空間,此工作空間和MATLAB的工作空間是相互獨(dú)立的,局部變量?jī)H存在于函數(shù)的工作空間內(nèi)。當(dāng)函數(shù)執(zhí)行完畢之后,該變量即自行消失。

2.全局變量

在MATLAB中,函數(shù)內(nèi)部定義的變量都是局部變量,它們不被加載到工作區(qū)間中。有時(shí),用戶需要使用全局變量,這時(shí)要使用global()函數(shù)來(lái)進(jìn)行定義。

局部變量只在一個(gè)工作區(qū)內(nèi)有效,無(wú)論是函數(shù)工作區(qū)還是MATLAB主工作區(qū)。與局部變量不同,全局變量可以在定義該變量的全部工作區(qū)中有效。當(dāng)在一個(gè)工作區(qū)內(nèi)改變?cè)撟兞康闹禃r(shí),該變量在其他工作區(qū)中的變量同時(shí)改變。

任何函數(shù)要使用全局變量,必須首先聲明,即使是在命令窗口也不例外。如果一個(gè)M文件中包含的子函數(shù)需要訪問(wèn)全局變量,則需在子函數(shù)中聲明該變量,如果需要在命令行中訪問(wèn)該變量,則需在命令行中聲明該變量。聲明格式:

global變量名1變量名2

3.永久變量

除局部變量和全局變量外,MATLAB中還有一種變量類型為永久變量。除了通過(guò)全局變量共享數(shù)據(jù)外,函數(shù)式M文件還可以通過(guò)persistent聲明一個(gè)變量,來(lái)對(duì)函數(shù)中重復(fù)使用和遞歸調(diào)用的變量的訪問(wèn)進(jìn)行限制,該變量就是永久變量。

(1)永久變量的特點(diǎn)如下:

①永久變量與全局變量類似,但是只能在M文件內(nèi)部定義,它的范圍被限制在聲明這些變量的函數(shù)內(nèi)部,不允許在其他的函數(shù)中對(duì)它們進(jìn)行改變。

②只有該變量從屬的函數(shù)能夠訪問(wèn)該變量。

③當(dāng)函數(shù)運(yùn)行結(jié)束時(shí),該變量的值保留在內(nèi)存中。只要M文件還在MATLAB的內(nèi)存中,永久變量就存在。因此當(dāng)該函數(shù)再次被調(diào)用時(shí),可以再次利用這些變量。

(2)永久變量的定義方法:

persistent變量名1變量名2

使用格式形如persistent(XYZ)。4.2.4函數(shù)的分類

函數(shù)可分為以下幾類:主函數(shù)、子函數(shù)、匿名函數(shù)、嵌套式函數(shù)、局部函數(shù)(私有函數(shù))及重載函數(shù)。

1.主函數(shù)

通常在M文件中的第一次調(diào)用的函數(shù)就叫主函數(shù),主函數(shù)中可以包含任意數(shù)量的子函數(shù),它們可以作為主程序的子程序。主函數(shù)可以被該文件之外的其他函數(shù)調(diào)用,而子函數(shù)只能被該文件內(nèi)的函數(shù)調(diào)用。一般來(lái)說(shuō),在命令窗口或是其他的M文件只能調(diào)用主函數(shù),主函數(shù)的調(diào)用就是直接調(diào)用存儲(chǔ)該函數(shù)的M文件的文件名。

2.子函數(shù)

一個(gè)M文件中可以包括多個(gè)函數(shù),除主函數(shù)之外的其他函數(shù)稱為子函數(shù)。子函數(shù)只能被主函數(shù)或該文件內(nèi)的其他子函數(shù)調(diào)用。每個(gè)子函數(shù)以函數(shù)定義語(yǔ)句開(kāi)頭,直至下一個(gè)函數(shù)的定義或文件的結(jié)尾。

當(dāng)函數(shù)中調(diào)用函數(shù)時(shí),系統(tǒng)判斷其函數(shù)類型的順序?yàn)椋菏紫扰袛嗍欠駷樽雍瘮?shù),然后判斷是否為私有函數(shù),最后判斷其是否為當(dāng)前目錄下的M文件函數(shù)或者系統(tǒng)內(nèi)置函數(shù)。由于子函數(shù)具有最高的優(yōu)先級(jí)別,因此在定義子函數(shù)時(shí),可以采用已有的其他外部函數(shù)的名稱。

3.局部函數(shù)

MATLAB中把放置在“private”目錄下的函數(shù)稱為局部函數(shù)(私有函數(shù)),局部函數(shù)是MATLAB中的另一類函數(shù),這些函數(shù)只有private目錄的父目錄中的函數(shù)才可以調(diào)用,其他目錄下的函數(shù)不能調(diào)用。

例如,當(dāng)前文件夾為matlabmath,matlabmath中包含子文件夾private,則private中的函數(shù)只能被matlabmath根目錄下的函數(shù)及這些函數(shù)調(diào)用的M文件調(diào)用。私有函數(shù)只能被其父文件夾中的函數(shù)調(diào)用,因此,用戶可以開(kāi)發(fā)自己的函數(shù)庫(kù),函數(shù)的名稱可以與系統(tǒng)標(biāo)準(zhǔn)M函數(shù)庫(kù)名稱相同,而不必?fù)?dān)心在函數(shù)調(diào)用時(shí)發(fā)生沖突,因?yàn)镸ATLAB首先查找私有函數(shù),再查找標(biāo)準(zhǔn)函數(shù)。

局部函數(shù)與子函數(shù)所不同的是,局部函數(shù)可以被其父目錄下的所有函數(shù)所調(diào)用,而子函數(shù)則只能被其所在的M文件的主函數(shù)所調(diào)用。所以,局部函數(shù)在可用的范圍上大于子函數(shù);在函數(shù)編輯的結(jié)構(gòu)上,局部函數(shù)與一般的函數(shù)文件的編輯相同,而子函數(shù)只能在主函數(shù)文件中編輯。

4.嵌套式函數(shù)

在MATLAB中,一個(gè)函數(shù)內(nèi)部可以定義一個(gè)或多個(gè)其他的函數(shù),這種在內(nèi)部定義的函數(shù)稱做嵌套式函數(shù)。在嵌套式函數(shù)的內(nèi)部也可以定義嵌套式函數(shù)。

需要注意的是,當(dāng)一個(gè)M文件中存在嵌套函數(shù)時(shí),該文件內(nèi)的所有函數(shù)無(wú)論是主函數(shù)還是嵌套函數(shù)都必須以end結(jié)尾。

1)嵌套函數(shù)的書(shū)寫(xiě)

定義嵌套函數(shù)時(shí),只要在一個(gè)函數(shù)內(nèi)部直接定義嵌套函數(shù)即可。

每個(gè)函數(shù)中可以平行嵌套多個(gè)函數(shù)。

嵌套函數(shù)還可以包含多層嵌套函數(shù)。例4-2-1嵌套函數(shù)的結(jié)構(gòu)。

解程序如下:

functionx=A(p1,p2)

...

functiony=B(p3)

...

end

...

end

2)嵌套函數(shù)的調(diào)用

一個(gè)嵌套函數(shù)可以被下列函數(shù)調(diào)用:

該嵌套函數(shù)的上一層函數(shù)。

同一母函數(shù)下的同級(jí)嵌套函數(shù)。

被任一低級(jí)別的函數(shù)調(diào)用。

5.重載函數(shù)

重載函數(shù)是為已經(jīng)存在的函數(shù)創(chuàng)建的一種附加應(yīng)用,這些已經(jīng)存在的函數(shù)被設(shè)計(jì)成專門(mén)執(zhí)行某種類的句柄,當(dāng)調(diào)用函數(shù)傳遞參數(shù)時(shí),MATLAB搜尋函數(shù)句柄執(zhí)行函數(shù)代碼。

每個(gè)重載的MATLAB函數(shù)都有一個(gè)類文件在MATLAB路徑下,類保存在以@打頭、類名命名的子文件夾中:@類名。例如,若用戶想使plot()函數(shù)的表達(dá)方法滿足自己的需要,則需要重載MATLAB的plot()函數(shù)。為此,若需要生成一個(gè)類(例如:polynom),則需建立一個(gè)子文件夾@polynom,并在該文件夾中保存類polynom和自己的文件plot.m,然后重載polynom類指定的plot()函數(shù)。

函數(shù)重載為程序編寫(xiě)和用戶調(diào)用都提供了很大的方便。函數(shù)重載允許多個(gè)函數(shù)使用相同的函數(shù)名、不同的輸入?yún)?shù)類型。在函數(shù)調(diào)用時(shí),系統(tǒng)根據(jù)輸入?yún)?shù)的情況自動(dòng)選擇相應(yīng)的函數(shù)執(zhí)行。4.2.5內(nèi)聯(lián)函數(shù)與匿名函數(shù)

內(nèi)聯(lián)函數(shù)是用戶用來(lái)自定義函數(shù)的一種形式,一般用于定義一些比較簡(jiǎn)單的數(shù)學(xué)函數(shù)。用命令inline來(lái)定義,因此叫內(nèi)聯(lián)函數(shù)。

1.內(nèi)聯(lián)函數(shù)

使用inline()函數(shù)可以構(gòu)建一個(gè)內(nèi)聯(lián)對(duì)象。調(diào)用方法如下:

(1)fun=inline(expr):使用MATLAB字符串表達(dá)式expr構(gòu)建一個(gè)內(nèi)聯(lián)函數(shù)對(duì)象。內(nèi)聯(lián)函數(shù)的輸入?yún)?shù)是通過(guò)搜索expr,找到一個(gè)除i、j以外的孤立小寫(xiě)字母來(lái)自動(dòng)確定的。如果沒(méi)有找到這樣的字符,就用x,如果字符x不是唯一的,就使用最靠近的x。如果找到了兩個(gè)字符,則選擇在字母表中靠后面的一個(gè)字符。

(2)?fun=inline(expr,arg1,arg2,...):使用表達(dá)式expr構(gòu)建一個(gè)內(nèi)聯(lián)函數(shù)對(duì)象。輸入?yún)?shù)由串“arg1,arg2,....”指定。

例如:f(x,y)=sin(x2+y2)可寫(xiě)成f=inline('sin(x.^2+y.^2)','x','y')。

(3)?fun=inline(expr,n):n是一個(gè)標(biāo)量,輸入?yún)?shù)是“x,P1,P2,...”。

MATLAB7.x后的版本中推薦用戶使用匿名函數(shù)取代內(nèi)聯(lián)函數(shù),匿名函數(shù)可以實(shí)現(xiàn)內(nèi)聯(lián)函數(shù)的幾乎全部功能,而速度和方便性卻比后者高很多。

2.匿名函數(shù)

匿名函數(shù)提供了一種創(chuàng)建簡(jiǎn)單程序的方法,使用它的用戶可以不必每次都編寫(xiě)M文件。用戶可以在MATLAB的命令窗口或是其他任意M文件和腳本文件中使用匿名函數(shù)。

匿名函數(shù)的格式如下:

fhandle=@(arglist)expr

其中,fhandle是為該函數(shù)創(chuàng)建的函數(shù)句柄;@符號(hào)用于創(chuàng)建函數(shù)句柄;arglist為用逗號(hào)分隔的參數(shù)列表;expr為函數(shù)主體,是MATLAB表達(dá)式。

例如,f(x,y)=sin(x2+y2)可寫(xiě)成f=(x,y)@sin(x.^2+y.^2)??捎媚涿瘮?shù)直接創(chuàng)建函數(shù),例如:

>>fh=@(x)1./((x-0.3).^2+0.01)+1./((x-0.9).^2+0.04)-6;

例4-2-2

有一個(gè)自定義函數(shù)myfun.m,具體如下:

functiony=myfun(x)

y=1./(x.^3-2*x-5);

解運(yùn)行下列命令可用匿名函數(shù)求出積分結(jié)果:

>>Q=quad(@myfun,0,2)

Q=-0.4605

也可以直接運(yùn)行匿名函數(shù)求出積分結(jié)果:

>>F=@(x)1./(x.^3-2*x-5);

>>Q=quad(F,0,2)

Q=-0.4605

4.3函數(shù)的調(diào)用與函數(shù)句柄

4.3.1函數(shù)參數(shù)與函數(shù)的調(diào)用

當(dāng)調(diào)用函數(shù)時(shí),主調(diào)函數(shù)通過(guò)函數(shù)參數(shù)的形式向被調(diào)函數(shù)傳遞數(shù)據(jù),被調(diào)函數(shù)通過(guò)函數(shù)返回值的形式向主調(diào)函數(shù)返回?cái)?shù)據(jù)。當(dāng)調(diào)用一個(gè)函數(shù)時(shí),需遵循下列規(guī)則。

1.輸入和輸出參量的數(shù)目

(1)當(dāng)調(diào)用一個(gè)函數(shù)時(shí),所用的輸入和輸出參量的數(shù)目,在其內(nèi)部是定義好了的。函數(shù)工作空間變量nargin包含輸入?yún)⒘總€(gè)數(shù);函數(shù)工作空間變量nargout包含輸出參量個(gè)數(shù)。事實(shí)上,這些變量常用來(lái)設(shè)置缺省輸入變量,并決定用戶所希望的輸出變量。例如,MATLAB的函數(shù)linspace():

functiony=linspace(d1,d2,n)

%LINSPACELinearlyspacedvector.

%LINSPACE(X1,X2)generatesarowvectorof100linearly

%equallyspacedpointsbetweenX1andX2.

%

%LINSPACE(X1,X2,N)generatesNpointsbetweenX1andX2.

%ForN<2,LINSPACEreturnsX2.

%

%SeealsoLOGSPACE,

%Copyright1984-2002TheMathWorks,Inc.

%$Revision:5.12$$Date:2002/02/0513:47:28$

ifnargin==2

n=100;

end

y=[d1+(0:n-2)*(d2-d1)/(floor(n)-1)d2];

這里,如果用戶只用兩個(gè)輸入?yún)⒘空{(diào)用linspace(),例如linspace(0,10),表示linspace產(chǎn)生100個(gè)數(shù)據(jù)點(diǎn)。相反,如果輸入?yún)⒘康膫€(gè)數(shù)是3,例如,linspace(0,10,50),那么第三個(gè)參量決定數(shù)據(jù)點(diǎn)的個(gè)數(shù)。

(2)可用一個(gè)或兩個(gè)輸出參量調(diào)用函數(shù)。例如函數(shù)size(),盡管這個(gè)函數(shù)不是一個(gè)函數(shù)M文件,而是一個(gè)內(nèi)置函數(shù)。size()函數(shù)的幫助文本說(shuō)明了它的輸出參量的選擇。

IZE

Matrixdimensions.

D=SIZE(X),forM-by-NmatrixX,returnsthetwo-element

rowvectorD=[M,N]

%containingthenumberofrowsandcolumns

inthematrix.

[M,N]=SIZE(X)%returnsthenumberofrowsandcolumns

inseparateoutputvariables.

(3)如果函數(shù)僅用一個(gè)輸出參量調(diào)用,就返回一個(gè)二元素的行,它包含行數(shù)和列數(shù)。相反,如果出現(xiàn)兩個(gè)輸出參量,size分別返回行和列。在函數(shù)M文件里,變量nargout可用來(lái)檢驗(yàn)輸出參量的個(gè)數(shù),并按要求修正輸出變量的創(chuàng)建。

(4)當(dāng)一個(gè)函數(shù)說(shuō)明一個(gè)或多個(gè)輸出變量,但沒(méi)有要求輸出時(shí),就簡(jiǎn)單地不給輸出變量賦任何值。MATLAB的函數(shù)toc()闡明了這個(gè)屬性。

functiont=toc

%

TOC

Readthestopwatchtimer.

%

TOC,byitself,printstheelapsedtimesinceTICwasused.

%

t=TOC;savestheelapsedtimeint,insteadofprintingitout.

%

%

SeealsoTIC,ETIME,CLOCK,CPUTIME.

%

Copyright(c)1984-94byTheMathWorks,Inc.

%

TOCusesETIMEandthevalueofCLOCKsavedbyTIC.

globalTICTOC

ifnargout<1

elapsed_time=etime(clock,TICTOC)

else

t=etime(clock,TICTOC);

end如果用戶用不以輸出參量調(diào)用toc(),例如,>>toc,那么就不指定輸出變量t的值,函數(shù)在命令窗口顯示函數(shù)工作空間變量elapsed_time,但在MATLAB工作空間里不創(chuàng)建變量。相反,如果toc是以>>out=toc調(diào)用,則按變量out將消逝的時(shí)間返回到命令窗口。

(5)當(dāng)一個(gè)函數(shù)的輸入?yún)⒘康膫€(gè)數(shù)超出了規(guī)定的范圍,MATLAB的nargchk()函數(shù)提供了統(tǒng)一的響應(yīng)。函數(shù)nargchk()可定義為

function

msg=nargchk(low,high,number)

%

NARGCHK

Checknumberofinputarguments.

%

Returnerrormessageifnotbetweenlowandhigh.

%

Ifitis,returnemptymatrix.

%

Copyright(c)1984-94byTheMathWorks,Inc.

msg=[

];

if(number<low)

msg='Notenoughinputarguments.';

elseif(number

>

high)

msg='Toomanyinputarguments.';

end下列的文件片段表明了在一個(gè)函數(shù)M文件內(nèi)的典型用法,即

error(nargchk(nargin,2,5))

如上所述,如果nargin的值小于2,函數(shù)error()能像前面描述的那樣進(jìn)行處理,nargchk()返回字符串?'沒(méi)有足夠的輸入?yún)⒘俊?。如果nargin的值大于5,函數(shù)error()執(zhí)行處理,nargchk()返回字符串?'太多輸入?yún)⒘俊?。如果nargin是在2和5之間,函數(shù)error()簡(jiǎn)單地將控制傳遞給下一個(gè)語(yǔ)句,nargchk()返回一個(gè)空字符串。也就是說(shuō),當(dāng)nargin的輸入?yún)⒘繛榭諘r(shí),error()函數(shù)什么也不做。

2.確定的函數(shù)參數(shù)數(shù)目

在MATLAB中,輸入/輸出參數(shù)是以單元數(shù)組的形式進(jìn)行傳輸?shù)模狠斎雲(yún)?shù)以單元數(shù)組的形式傳遞給函數(shù),單元數(shù)組的每個(gè)元素為相應(yīng)的參數(shù)。同樣,輸出參數(shù)也是以單元數(shù)組的形式組織的。如此的參數(shù)組織形式便于函數(shù)接受任意數(shù)目的參數(shù)。

MATLAB可以有任意數(shù)量的輸入和輸出變量,這些輸入和輸出參數(shù)的特性和規(guī)則

如下:

函數(shù)式M文件可以沒(méi)有輸入和輸出變量。

函數(shù)可以用比M文件中的函數(shù)定義行所規(guī)定的輸入/輸出變量更少的變量進(jìn)行調(diào)用,但是調(diào)用變量不能比規(guī)定的輸入/輸出變量多。

在一次調(diào)用中所用到的輸入和輸出變量的個(gè)數(shù)可以通過(guò)分別調(diào)用函數(shù)nargin()和nargout()來(lái)確定。

函數(shù)nargin()和nargout()分別用于確定函數(shù)的輸入、輸出參數(shù)個(gè)數(shù)。在函數(shù)體內(nèi)部用nargin(nargout)?確定用戶提供的輸入(輸出)參數(shù)個(gè)數(shù)。在函數(shù)體外部用nargin(nargout)?確定一個(gè)給定的函數(shù)的輸入(輸出)參數(shù)個(gè)數(shù),如果函數(shù)的參數(shù)的數(shù)目是可變的,則返回一個(gè)負(fù)值。語(yǔ)法如下:

(1)?nargin()、nargout():返回指定的輸入、輸出參數(shù)個(gè)數(shù)。

(2)?nargin(fun)、nargout(fun):返回由函數(shù)fun確定的輸入、輸出參數(shù)個(gè)數(shù)。fun可以是函數(shù)名或函數(shù)句柄名。如果函數(shù)的輸入、輸出參數(shù)的數(shù)目是可變的,則nargin()、nargout()返回一個(gè)負(fù)值。在函數(shù)體內(nèi)部用nargin(nargout)?確定了輸入/輸出參數(shù)后,可以用條件語(yǔ)句確定需要執(zhí)行的操作。

在調(diào)用該函數(shù)時(shí)可以輸入任意數(shù)目的參數(shù),參數(shù)可以為二元數(shù)組或者表示線型的字符串,該函數(shù)將用指定的線型繪制輸入數(shù)據(jù)的圖像。指定線型的字符串可以在任意位置輸入,并且可以輸入多個(gè)。但需要注意的是,只有最后一個(gè)字符串起作用。

在上面的程序中,將所有輸入?yún)?shù)作為一個(gè)單元數(shù)組,利用花括號(hào)和圓括號(hào)對(duì)數(shù)組元素進(jìn)行訪問(wèn),實(shí)現(xiàn)輸入?yún)?shù)的調(diào)用。例4-3-1

顯示一個(gè)函數(shù)myplot()的接口代碼,它接受一個(gè)數(shù)目可選的輸入和輸出參數(shù)。

function[x0,y0]=myplot(x,y,npts,angle,subdiv)

%MYPLOTPlotafunction.

%MYPLOT(x,y,npts,angle,subdiv)

%Thefirsttwoinputargumentsare

%required;theotherthreehavedefaultvalues.

...

ifnargin<5,subdiv=20;end

ifnargin<4,angle=10;end

ifnargin<3,npts=25;end

...

ifnargout==0

plot(x,y)

else

x0=x;

y0=y;

end注意:由于nargin()和nargout()是函數(shù)而不是變量,因此用戶不能用諸如nargin=nargin+

pi之類的語(yǔ)句對(duì)它們進(jìn)行重新賦值。

nargin()和nargout()是函數(shù),當(dāng)在函數(shù)中調(diào)用這兩個(gè)函數(shù)時(shí),其值為該函數(shù)的輸入或輸出參數(shù),而不需要進(jìn)行聲明。如上面的例子中,在函數(shù)A中調(diào)用nargin(B(nargin,y*rand(4)))表示函數(shù)A的輸入?yún)?shù)個(gè)數(shù),在函數(shù)C中調(diào)用nargin表示函數(shù)C的輸入?yún)?shù)個(gè)數(shù)。

3.參數(shù)數(shù)目可變的函數(shù)

函數(shù)nargin()和函數(shù)nargout()允許函數(shù)接收或返回任意數(shù)目的參數(shù)。在嵌套函數(shù)中也可以使用可變參數(shù)。但需要注意的是,varargin、varargout和nargin、nargout的意義可能有所不同。

varargin和varargout為變量,與MATLAB其他變量的作用范圍相同。由于嵌套函數(shù)與主函數(shù)使用相同的工作區(qū),因此varargin和varargout既可以表示嵌套函數(shù)的輸入輸出參數(shù),也可以是主函數(shù)的輸入/輸出函數(shù),具體值取決于程序中的變量聲明:

如果嵌套函數(shù)在函數(shù)聲明中包含varargin或者varargout,則在該函數(shù)內(nèi)部調(diào)用這兩個(gè)變量時(shí),變量?jī)?nèi)容為該函數(shù)的輸入輸出參數(shù);

如果嵌套函數(shù)聲明中沒(méi)有包含varargin或者varargout,而在該函數(shù)的上層函數(shù)聲明中包含varargin或者varargout,則當(dāng)在該嵌套函數(shù)內(nèi)部調(diào)用這兩個(gè)變量時(shí),變量?jī)?nèi)容為上層函數(shù)的輸入輸出參數(shù)。

(1)?varargin:代表一個(gè)可變長(zhǎng)度的輸入列表。語(yǔ)法如下:

functiony=bar(varargin)

接受一個(gè)可變數(shù)量的參數(shù)到函數(shù)bar.m.。

該varargin語(yǔ)句僅用于函數(shù)內(nèi)部包含可選的輸入?yún)?shù)傳遞給函數(shù)。該varargin參數(shù)必須被聲明為函數(shù)的最后一個(gè)輸入?yún)?shù),所有的輸入?yún)?shù)都從該點(diǎn)開(kāi)始。在聲明中,varargin必須小寫(xiě)。

例4-3-2

編寫(xiě)一個(gè)函數(shù),顯示所需要的和可選的參數(shù),并將其傳遞給該函數(shù)。

解程序如下:

functionvartest(argA,argB,varargin)

optargin=size(varargin,2);

stdargin=nargin-optargin;

fprintf('Numberofinputs=%d\n',nargin)

fprintf('Inputsfromindividualarguments(%d):\n',...

stdargin)

ifstdargin>=1

fprintf('%d\n',argA)

end

ifstdargin==2

fprintf('%d\n',argB)

end

fprintf('Inputspackagedinvarargin(%d):\n',optargin)

fork=1:size(varargin,2)

fprintf('%d\n',varargin{k})

end在MATLAB命令窗口調(diào)用該函數(shù),可觀察到提取出從varargin單元數(shù)組指定的參數(shù)。

>>vartest(10,20,30,40,50,60,70)

Numberofinputs=7

Inputsfromindividualarguments(2):

10

20

Inputspackagedinvarargin(5):

30

40

50

60

70例4-3-3

編寫(xiě)以下函數(shù)。

解程序如下:

functionmyplot(x,varargin)

plot(x,varargin{:})

在MATLAB命令窗口調(diào)用該函數(shù),所有的輸入都從第二個(gè)輸入變量varargin開(kāi)始,myplot使用逗號(hào)分隔列表的語(yǔ)法varargin{:}傳送可選的參數(shù)來(lái)繪制圖形。

>>myplot(sin(0:.01:10),'color',[.5.7.3],'linestyle','.')

varargin結(jié)果是一個(gè)1?×?4元素的單元數(shù)組,包含?'color'、[.5

.7

.3]、'linestyle'?和?'.'。繪制出的正弦曲線圖形如圖4-3所示。圖4-3繪制出的正弦曲線圖形

(2)?varargout:代表一個(gè)可變長(zhǎng)度的輸出列表。語(yǔ)法如下:

functionvarargout=foo(n)

從函數(shù)foo.m.返回一個(gè)可變數(shù)量的參數(shù)表。varargout僅用于函數(shù)內(nèi)部包含可選的、由函數(shù)返回的輸出參數(shù)。varargout參數(shù)必須被聲明為函數(shù)的最后一個(gè)輸出參數(shù),所有輸出從該點(diǎn)開(kāi)始,在聲明中,varargout必須小寫(xiě)。

4.變量

(1)全局變量可以被其他函數(shù)或工作空間共享。如果所調(diào)用函數(shù)的變量被說(shuō)明是全局性的,該函數(shù)可以被其他函數(shù)共享,還可以被MATLAB工作空間共享,并且可以遞歸調(diào)用全局變量本身。如果要說(shuō)明該變量是全局的,在一個(gè)函數(shù)內(nèi)部或在MATLAB工作空間中訪問(wèn)一個(gè)變量,必須在函數(shù)內(nèi)和每一個(gè)所希望訪問(wèn)的工作空間中。

全局變量使用的例子可以在MATLAB函數(shù)tic和toc中看到,它們結(jié)合在一起共同工作。例如在一個(gè)“跑表”程序中,函數(shù)tic和toc代碼如下:

functiontic

%

TIC

Startastopwatchtimer.

%

Thesequenceofcommands

%

TIC

%

anystuff

%

TOC

%

printsthetimerequiredforthestuff.

%

%

SeealsoTOC,CLOCK,ETIME,CPUTIME.

%

Copyright(c)1984-94byTheMathWorks,Inc.

%

TICsimplystoresCLOCKinaglobalvariable.

globalTICTOC

TICTOC=clock;

functiont=toc

%

TOC

Readthestopwatchtimer.

%

TOC,byitself,printstheelapsedtimesinceTICwasused.

%

t=TOC;savestheelapsedtimeint,insteadofprintingitout.

%

%

SeealsoTIC,ETIME,CLOCK,CPUTIME.

%

Copyright(c)1984-94byTheMathWorks,Inc.

%

TOCusesETIMEandthevalueofCLOCKsavedbyTIC.

globalTICTOC

ifnargout<1

elapsed_time=etime(clock,TICTOC)

else

t=etime(clock,TICTOC);

end在函數(shù)tic()中,變量TICTOC說(shuō)明為全局的,因此它的值由調(diào)用函數(shù)clock()來(lái)設(shè)定。以后在函數(shù)toc()中,變量TICTOC也說(shuō)明為全局的,讓toc()訪問(wèn)存儲(chǔ)在TICTOC中的值。利用這個(gè)值,toc()計(jì)算自執(zhí)行函數(shù)tic()以來(lái)消失的時(shí)間。值得注意的是,變量TICTOC存在于tic()和toc()的工作空間,而不在MATLAB的工作空間。

(2)實(shí)際編程中,無(wú)論什么時(shí)候應(yīng)盡量避免使用全局變量。如果要使用全局變量,建議全局變量名要長(zhǎng),它應(yīng)包含所有要使用該全局變量的函數(shù)名的大寫(xiě)字母,并選擇以首次出現(xiàn)的M文件的名字開(kāi)頭。例如上面的M函數(shù)文件tic()首次出現(xiàn),全局變量聲明為:globalTICTOC。如果遵循這些建議,則可把全局變量之間不必要的相互作用減至最小。例如,如果在另一函數(shù)或MATLAB工作空間說(shuō)明TICTOC為全局的,那么它的值在該函數(shù)或MATLAB工作空間內(nèi)可被改變,由于變量TICTOC只可以存在于tic()和toc()的工作空間,而不在MATLAB工作空間和其他函數(shù)中。TICTOC的值由于被其他函數(shù)或MATLAB工作空間改變,而使得函數(shù)toc()得到不同的、可能是無(wú)意義的結(jié)果。

5.調(diào)用腳本M文件

從函數(shù)M文件內(nèi)可以調(diào)用腳本文件。在這種情況下,腳本文件查看函數(shù)工作空間,不查看MATLAB工作空間。從函數(shù)M文件內(nèi)調(diào)用的腳本文件不必用調(diào)用函數(shù)編譯到內(nèi)存。函數(shù)每調(diào)用一次,它們就被打開(kāi)和解釋一次。因此,從函數(shù)M文件內(nèi)調(diào)用腳本文件減慢了函數(shù)的執(zhí)行。

6.遞歸調(diào)用

函數(shù)可以遞歸調(diào)用,即函數(shù)M文件能調(diào)用它們本身。例如以下函數(shù)ichina():

functionichina(n)

%ichinaRecursiveFunctionCallExample

%Copyright(c)2010byLGL

ifnargin==0,n=20;end

ifn>1

disp('中國(guó)是一個(gè)歷史悠久的文明國(guó)家。')

ichina(n-1)

else

disp('我是中國(guó)人!')

end

調(diào)用這個(gè)函數(shù)產(chǎn)生以下結(jié)果:

>>ichina(3)

中國(guó)是一個(gè)歷史悠久的文明國(guó)家。

中國(guó)是一個(gè)歷史悠久的文明國(guó)家。

我是中國(guó)人!遞歸調(diào)用函數(shù)在許多應(yīng)用場(chǎng)合是有用的。在編制要遞歸調(diào)用的函數(shù)時(shí),必須確保會(huì)終止,否則MATLAB會(huì)陷入死循環(huán)。最后,在一個(gè)遞歸函數(shù)內(nèi),如果變量說(shuō)明是全局的,則該全局變量對(duì)以后所有函數(shù)調(diào)用是可用的。在這個(gè)意義下,全局變量變成靜態(tài)的,并在函數(shù)調(diào)用之間不會(huì)消失。

7.函數(shù)終點(diǎn)

當(dāng)函數(shù)M文件到達(dá)M文件終點(diǎn),或者碰到返回命令return時(shí),就結(jié)束執(zhí)行和返回。

return命令提供了一種結(jié)束一個(gè)函數(shù)的簡(jiǎn)單方法,而不必到達(dá)文件的終點(diǎn)。

MATLAB的函數(shù)error()在命令窗口顯示一個(gè)字符串,放棄函數(shù)執(zhí)行,把控制權(quán)返回給鍵盤(pán)。這個(gè)函數(shù)對(duì)提示函數(shù)使用不當(dāng)很有用,如在以下文件片段中:

iflength(val)>1

error('

VALmustbeascalar.

')

end

這里,如果變量val不是一個(gè)標(biāo)量,error顯示消息字符串,則把控制權(quán)返回給命令窗口和鍵盤(pán)。4.3.2函數(shù)句柄

在很多情況下,用戶需要將一個(gè)函數(shù)的標(biāo)識(shí)作為參數(shù)傳遞給另一個(gè)函數(shù),MATLAB支持用字符串代表函數(shù),例如sin代表正弦函數(shù),也可以使用內(nèi)聯(lián)函數(shù)(inlinefunction)來(lái)傳遞。由于匿名函數(shù)的引入,因此使用函數(shù)句柄。

當(dāng)需要調(diào)用MALTAB函數(shù)時(shí),需要通過(guò)符號(hào)“@”獲取函數(shù)句柄,利用函數(shù)句柄實(shí)現(xiàn)對(duì)函數(shù)的操作。函數(shù)句柄提供了一種間接訪問(wèn)函數(shù)的手段,使用函數(shù)句柄具有以下優(yōu)勢(shì):

用戶可以很方便地調(diào)用其他函數(shù);

提供函數(shù)調(diào)用過(guò)程中的可靠性;

減少程序設(shè)計(jì)中的冗余;

同時(shí)可以在使用函數(shù)的過(guò)程中保存函數(shù)相關(guān)的信息,尤其是關(guān)于函數(shù)執(zhí)行的信息。

利用函數(shù)句柄可以實(shí)現(xiàn)對(duì)函數(shù)的間接操作,既可以通過(guò)將函數(shù)句柄傳遞給其他函數(shù)實(shí)現(xiàn)對(duì)函數(shù)的操作,也可以將函數(shù)句柄保存在變量中,留待以后調(diào)用操作。函數(shù)句柄是一個(gè)強(qiáng)有力的工具,當(dāng)有一個(gè)函數(shù)句柄被創(chuàng)建時(shí),它將記錄函數(shù)的詳細(xì)信息,因此當(dāng)一個(gè)句柄調(diào)用該函數(shù)時(shí),MATLAB立即執(zhí)行,不需要進(jìn)行文件搜索。尤其是反復(fù)調(diào)用一個(gè)函數(shù)時(shí),可以節(jié)省大量的搜索時(shí)間,提高執(zhí)行效率。

函數(shù)句柄的另一個(gè)重要特性是用來(lái)標(biāo)識(shí)子函數(shù)、私有函數(shù)和嵌套函數(shù)。使這些“隱蔽”的函數(shù)“顯現(xiàn)”出來(lái)。

1.函數(shù)句柄的創(chuàng)建

函數(shù)句柄的創(chuàng)建比較簡(jiǎn)單,是通過(guò)@符號(hào)創(chuàng)建的,其格式為

fhandle=@functionname。

其中,fhandle為所創(chuàng)建的函數(shù)句柄,functionname為所創(chuàng)建的函數(shù)。

例如:trigFun=@sin;

可以使用單元數(shù)組保存函數(shù)句柄,如trighandle={@sin,@cos,@tan};使用時(shí)只需引用該函數(shù)所在單元。

2.函數(shù)句柄的調(diào)用

通過(guò)函數(shù)句柄實(shí)現(xiàn)對(duì)函數(shù)的間接調(diào)用,其調(diào)用格式與直接調(diào)用函數(shù)的格式相同。

例如,在命令窗口中調(diào)用程序:

>>trigFun(pi/2)

ans=

1

溫馨提示

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