官术网_书友最值得收藏!

2.3 函數文件

函數文件是另一種形式的 M 文件,每一個函數文件都是定義的一個函數。事實上,MATLAB提供的標準函數大部分都是由函數文件定義的,這足以說明函數文件的重要性。從使用的角度看,函數是一個“黑箱”,把一些數據送進去,經加工處理,把結果送出來。從形式上看,函數文件區別于命令文件之處,在于命令文件的變量在文件執行完成后保留在工作空間中,而函數文件內定義的變量,只在函數文件內部起作用,當函數文件執行完后,這些內部變量將被清除。因此,在應用函數文件時,只關心函數的輸入和輸出。

2.3.1 基本結構

函數文件由關鍵字function引導,其基本結構為:

說明:以function開頭的一行為引導行,表示該文件是一個函數文件。函數名的命名規則與變量名相同。輸入形參表是函數的輸入參數,可以有多個,用 “逗號” 來分隔;輸出形參表為函數的輸出參數,當輸出形參只有一個時,直接輸入變量名而不用方括號,多個輸出形參用 “逗號” 來分隔。

注意:函數文件編輯結束后,不能像M文件那樣單擊 〈F5〉 鍵或單擊 “運行” 按鈕,而是要直接存盤。

(1)函數文件名

函數文件名通常由函數名再加上擴展名m組成,不過函數文件名與函數名也可以不相同。當兩者不同時,MATLAB將忽略函數名而使用函數文件名,調用函數時以函數文件名為依據。因此,最好把函數文件名和函數名統一,以免出錯。

(2)注釋說明

注釋說明包括以下3部分內容。

1)緊隨函數文件定義行之后,以%開頭的第一行。這一行一般包括大寫的函數文件名和函數功能的簡要描述,供lookfor關鍵詞查詢和help在線幫助用。

2)第一行之后連續的注釋行。通常包括函數輸入、輸出參數的含義及調用格式說明等信息,構成全部在線幫助文本。

3)與在線幫助文本相隔一個空行的注釋行。包括函數文件編寫和修改的信息,如作者、修改日期、版本等內容,用于軟件檔案管理。

(3)return語句

如果在函數文件中插入了return語句,則執行到該語句就結束函數的執行,程序流程轉到調用該函數的位置。通常在函數文件中缺省return語句,這時在被調函數執行完成后自動返回。

2.3.2 函數調用

函數文件編制好后,就可以調用函數進行計算了。函數調用的一般格式為:

需要注意的是,函數調用時各實參出現的順序、個數,應與函數定義時形參的順序、個數一致,否則會出錯。函數調用時,先將實參傳遞給相應的形參,從而實現參數傳遞,然后再執行函數的功能。

例2-12】 編寫一個函數文件,函數文件和函數名均為datfunction.m,對輸入的兩個數進行加、減運算。

打開文本編輯器或單擊 “新建”→“腳本”,輸入以下程序:

直接存盤后,在MATLAB的命令行窗口調用該函數文件:

也可以通過help來了解該函數,例如在命令行窗口輸入:help datfunction,單擊〈Enter〉 鍵后,顯示:“這是一個計算兩個數和、差的函數。”

在MATLAB中,函數可以嵌套調用,即一個函數可以調用別的函數,甚至調用自身。在調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的遞歸調用。

例2-13】 有5個人坐在一起,問第5 個人多少歲,他說比第4個人大2歲;問第4個人歲數,他說比第3個人大2歲;問第3個人歲數,他說比第2個人大2歲;問第2個人歲數,他說比第1個人大2歲;最后問第1個人歲數,他說是12歲。求第5個人多大?

打開文本編輯器或單擊 “新建” → “腳本”,輸入以下程序:

直接存盤后,在MATLAB的命令行窗口調用該函數文件:

當函數調用完畢后,可以用who或whos查看工作空間中的變量,也可以查看工作空間窗口(workspace),會發現在工作空間窗口只有 hisage一個變量存在,函數調用過程中的變量都已經釋放。函數有自己的專用工作空間,函數內變量與MATLAB工作空間之間唯一的聯系是函數的輸入和輸出參數。如果函數的輸入參數值發生變化,其變化僅在函數內出現,不影響MATLAB工作空間的其他變量。函數內所創建的變量只駐留在函數的工作空間,而且只在函數執行期間臨時存在,函數調用結束后就釋放了。

2.3.3 參數的可調性

MATLAB在函數調用上有一個與一般高級語言不同之處,就是函數所傳遞參數數目的可調性。憑借這一點,一個函數可完成多種功能。在調用函數時,MATLAB用兩個永久變量nargin和 nargout分別記錄調用函數時的輸入實參和輸出實參的個數。只要在函數文件中包含這兩個變量,就可以準確地知道該函數文件被調用時的輸入輸出參數個數,從而決定函數如何進行處理。

例2-14】 編寫一個函數文件test,比較輸入1個參數、2個參數和3個參數時的結果。

在命令行窗口輸入以下內容:

2.3.4 全局變量

由于函數文件定義的內部變量只在該函數內有效,這些變量不能直接被另一個函數文件所使用。為了解決這個問題,MATLAB使用全局變量。全局變量的作用域是整個MATLAB工作空間,即全程有效,所有的函數都可以對其進行存取和修改,因此定義全局變量是函數間傳遞信息的一種手段。在函數文件里,全局變量的定義語句應放在變量使用之前,為了便于了解所有的全局變量,一般把全局變量的定義語句放在文件的前部。定義全局變量的方法是使用global函數,其格式為:

值得指出,在程序設計中,全局變量固然可以帶來某些方便,但卻破壞了函數對變量的封裝,降低了程序的可讀性。因而,在結構化程序設計中,全局變量是不受歡迎的。尤其當程序較大,子程序較多時,全局變量將給程序調試和維護帶來不便,故不提倡使用全局變量。如果一定要用全局變量,最好起一個能反映變量含義的名字,以免和其他變量混淆,全局變量名多用大寫字母,并有選擇地以首次出現的M文件的名字開頭,這樣,可把多個全局變量之間不必要的互作用減至最小。

例2-15】 建立一個函數文件sub,比較下面兩個文件的運行結果,說明全局變量的作用。函數文件如下:

將sub文件保存后,輸入文件1:

運行文件1后,激活命令行窗口,觀看運行結果為:

接下來輸入文件2,內容如下:

運行文件2后激活命令行窗口,觀看運行結果為:

注意:運行完文件1,再運行文件2時,一定要在文件2的開頭加上clear函數,否則結果相同,因為全局變量X已經在工作空間內。

主站蜘蛛池模板: 金山区| 樟树市| 维西| 南澳县| 扶绥县| 台前县| 秀山| 蒙自县| 双流县| 瑞安市| 拉萨市| 通许县| 玛沁县| 德兴市| 康保县| 涪陵区| 松原市| 安宁市| 依安县| 康乐县| 介休市| 桂阳县| 长岭县| 兴文县| 海盐县| 大英县| 西青区| 永新县| 台州市| 虞城县| 正镶白旗| 栾川县| 屯昌县| 旬阳县| 城步| 泌阳县| 清新县| 会宁县| 河北省| 麦盖提县| 集安市|