天天看點

《MATLAB神經網絡超級學習手冊》——2.4 M檔案

本節書摘來自異步社群《matlab神經網絡超級學習手冊》一書中的第2章,第2.4節,作者:matlab技術聯盟 , 劉冰 , 郭海霞著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

matlab神經網絡超級學習手冊

m檔案有兩種形式:腳本檔案(script file)和函數檔案(function file)。腳本檔案通常用于執行一系列簡單的matlab指令,運作時隻需輸入檔案名字,matlab就會自動按順序執行檔案中的指令。

函數檔案和腳本檔案不同,它可以接受參數,也可以傳回參數,在一般情況下,使用者不能靠單獨輸入其檔案名來運作函數檔案,而必須由其他語句來調用,matlab的大多數應用程式都以函數檔案的形式給出。

2.4.1 m檔案概述

matlab提供了極其豐富的内部函數,使得使用者可以通過指令行調用就可以完成很多工作,但是想要更加高效地利用matlab,離不開matlab程式設計。

使用者可以通過組織一個matlab指令序列完成一個獨立的功能,這就是腳本m檔案程式設計;而把m檔案抽象封裝,形成可以重複利用的功能塊,這就是函數m檔案程式設計。是以,matlab程式設計是提高matlab應用效率,把matlab基本函數擴充為實際的使用者應用的必經之道。

m檔案是包含matlab代碼的檔案。m檔案按其内容和功能可以分為腳本m檔案和函數m檔案這兩大類。

1.腳本m檔案

它是許多matlab代碼按順序組成的指令序列集合,不接受參數的輸入和輸出,與matlab工作區共享變量空間。腳本m檔案一般用來實作一個想對獨立的功能,比如對某個資料集進行某種分析、繪圖,求解某個已知條件下的微分方程等。使用者可以通過在指令視窗直接鍵入檔案名來運作腳本m檔案。

通過腳本m檔案,使用者可以把為實作一個具體功能的一系列matlab代碼書寫在一個m檔案中,每次隻需要鍵入檔案名即可運作腳本m檔案中的所有代碼。

2.函數m檔案

它也是為了實作一個單獨功能的代碼塊,但它與腳本m檔案不同的是需要接受參數輸入和輸出,函數m檔案中的代碼一般隻處理輸入參數傳遞的資料,并把處理結果作為函數輸出參數傳回給matlab工作區中指定的接受量。

是以,函數m檔案具有獨立的内部變量空間,在執行函數m檔案時,需指定輸入參數的實際取值,而且一般要指定接收輸出結果的工作區變量。

matlab提供的許多函數就是用函數m檔案編寫的。尤其是各種工具箱中的函數,使用者可以打開這些m檔案檢視。實際上,對應特殊應用領域的使用者,如果積累了充足的專業領域應用的函數,就可以組建自己的專業領域工具箱。

通過函數m檔案,使用者可以把為實作一個抽象功能的matlab代碼封裝成一個函數接口,在以後的應用中重複調用。

matlab中的m檔案一般包括以下5部分結構。

(1)函數聲明行。

這一行隻出現在m檔案的第一行,通過function關鍵字表明此檔案是一個m檔案,并指定函數名、輸入和輸出參數。

(2)h1行。

這是幫助文字的第一行,給出m檔案幫助最關鍵的資訊。當用lookfor查找某個單詞相關的函數時,lookfor隻在h1行中搜尋是否出現指定單詞。

(3)幫助文字。

這部分對m檔案更加詳細的說明,解釋m檔案實作的功能,m檔案中出現的各變量、參數的意義,以及操作版權詳細資訊等。

(4)m檔案正文。

這是m檔案實作功能的matlab代碼部分,通常包括運算、指派等指令。

(5)注釋部分。

這部分出現的位置比較靈活,主要是用來注釋m檔案正文的具體運作過程,友善閱讀和修改,經常穿插在m檔案正文中間。

2.4.2 局部變量與全局變量

無論在腳本檔案還是在函數檔案中,都會定義一些變量。函數檔案所定義的變量是局部變量,這些變量獨立于其他函數的局部變量和工作空間的變量,即隻能在該函數的工作空間引用,而不能在其他函數工作空間和指令工作空間引用。但是如果某些變量被定義成全局變量,就可以在整個matlab 工作空間進行存取和修改,以實作共享。是以,定義全局變量是函數間傳遞資訊的一種手段。

用指令global定義全局變量,其格式如下。

将a、b、c這3個變量定義為全局變量。

在m檔案中定義全局變量時,如果在目前工作空間已經存在相同的變量,系統将會給出警告,說明由于将該變量定義為全局變量,可能會使變量的值發生改變。為避免發生這種情況,應該在使用變量前先将其定義為全局變量。

提示:

在matlab中對變量名是區分大小寫的,是以為了在程式中厘清楚而不至于誤聲明,習慣上可以将全局變量定義為大寫字母。

【例2-27】全局變量的使用。

解:在commond window視窗輸入以下指令。

然後在指令視窗聲明全局變量指派調用。

通過例2-27可見,用global将a聲明為全局變量後,函數内部對a的修改也會直接作用到matlab工作區中,函數調用一次後,a的值從2變為11。

2.4.3 m檔案的編輯與運作

matlab語言是一種高效的程式設計語言,可以用普通的文本編輯器把一系列matlab語句寫在一起構成matlab程式,然後存儲在一個檔案裡,檔案的擴充名為.m,是以稱為m檔案。這些檔案都是由純ascii碼字元構成的,在運作m檔案時隻需在matlab指令視窗下輸入該檔案名即可。

在matlab的編輯器中建立與編輯m檔案的一般步驟如下。

1.建立檔案

(1)最簡單的方法是單擊 matlab主界面工具欄上的圖檔 13圖示。

(2)在commond window視窗輸入edit語句建立新檔案,或輸入edit filename語句,打開名為filename的m檔案,在彈出檔案不存在的提示框中,單擊“yes”按鈕,則建立名為filename 新的m檔案。

(3)選擇matlab主界面的home→new子菜單,在其下拉菜單中選擇“script”項。

(4)如果已經打開了檔案編輯器後需要再建立新檔案,可以用編輯器的菜單或工具欄上相應的圖示進行操作。

還可以使用“ctrl+n”的快捷方式打開一個新的m檔案。

2.打開檔案

(1)單擊matlab主界面工具欄上的圖檔 14圖示,彈出open視窗,選擇已有的m 檔案,單擊“打開”按鈕,如圖2-8所示。

《MATLAB神經網絡超級學習手冊》——2.4 M檔案

(2)輸入edit filename語句,打開名為filename的m檔案。

3.編輯檔案

雖然m檔案是普通的文本檔案,在任何的文本編輯器中都可以編輯,但matlab系統提供了一個更友善的内部編輯器(editor),如圖2-9所示。

《MATLAB神經網絡超級學習手冊》——2.4 M檔案

對于建立的m檔案,可以在matlab的editor視窗編寫新的檔案;對于打開的已有m檔案,其内容顯示在editor視窗,使用者可以對其進行修改。

在編輯的過程中可以使用類似于其他文本編輯器(如word)的“複制”(copy)菜單、工具欄的編輯圖示和快捷鍵等,值得注意的是,除了注釋内容外,所有matlab的語句都要使用西文字元。

4.儲存檔案

m檔案在運作之前必須先儲存。其方法如下。

單擊編輯器工具欄上的圖檔 17圖示:對于建立的m檔案,則彈出“儲存檔案”(save file as)對話框,選擇存放的路徑、檔案名和檔案儲存類型(不選擇時為m 檔案),單擊“儲存”按鈕,即可完成儲存;對于打開的已有m檔案,則直接完成儲存。

使用“ctrl+s”的快捷方式。等同于單擊編輯器工具欄上的圖檔 18圖示。

選擇工具欄save下拉菜單中的“save as…”選項,可以在彈出“儲存檔案”(select file for save as)對話框中,重新選擇存放的目錄、檔案名進行儲存。

5.運作檔案

腳本檔案可直接運作,而函數檔案還必須輸入函數參數。

(1)在指令視窗輸入要運作的檔案名即可開始運作,需要注意的是,在運作前,一定要先儲存檔案,否則運作的是儲存前的程式。

(2)如果在編輯器中完成編輯後需要直接運作,可以直接用滑鼠單擊圖檔 19圖示。

(3)按f5鍵則儲存程式并直接運作;如果是建立m檔案,則彈出“儲存檔案”對話框,使用者儲存檔案後直接運作。

2.4.4 腳本檔案

腳本檔案是m檔案中最簡單的一種,不需要輸入頓号輸出參數,用指令語句可以控制matlab指令工作空間的所有資料。

在運作過程中,産生的所有變量均是指令工作空間變量,這些變量一旦生成,就一直儲存在記憶體空間中,除非使用者執行clear指令将它們清除。運作一個腳本檔案等價于從指令視窗中順序運作檔案裡的語句。由于腳本檔案隻是一串指令的集合,是以隻需像在指令視窗中輸入語句那樣,依次将語句編輯在腳本檔案中即可。

【例2-28】程式設計計算向量元素的平均值。

解:在matlab編輯視窗輸入以下指令。

将其儲存為pingjun.m,運作之,如果輸入行向量[1 2 3],則運作結果如下。

如果輸入的不是向量,如[1 2; 3 4],則運作結果如下。

輸入變量:a=[1 2; 3 4],則運作結果如下。

這是因為必須輸入向量。

2.4.5 函數檔案

如果m檔案的第一個可執行語句以function開始,該檔案就是函數檔案,每一個函數檔案都定義一個函數。事實上,matlab 提供的函數指令大部分都是由函數檔案定義的,這足以說明函數檔案的重要。

從使用的角度看,函數是一個“黑箱”,把一些資料送進去,經加工處理,把結果送出來。從形式上看,函數檔案差別于腳本檔案之處在于腳本檔案的變量為指令工作空間變量,在檔案執行完成後保留在指令工作空間中;而函數檔案内定義的變量為局部變量,隻在函數檔案内部起作用,當函數檔案執行完後,這些内部變量将被清除。

【例2-29】編寫函數 average( )用于計算向量元素的平均值。

将檔案存盤,預設狀态下函數名為average_2.m(檔案名與函數名相同),函數average接受一個輸入參數并傳回一個輸出參數,該函數的用法與其他matlab 函數一樣;在matlab 指令視窗中運作以下語句,便可求得1~9的平均值。

通常函數檔案由以下幾個基本部分組成。

(1)函數定義行。函數定義行由關鍵字function 引導,指明這是一個函數檔案,并定義函數名、輸入參數和輸出參數,函數定義行必須為檔案的第一個可執行語句,函數名與檔案名相同,可以是matlab 中任何合法的字元。

函數檔案可以帶有多個輸入和輸出參數,如下。

也可以沒有輸出參數,如下。

(2)h1行。h1行就是幫助文本的第一行,是函數定義行下的第一個注釋行,是供lookfor查詢時使用的。一般來說為了充分利用matlab的搜尋功能,在編制m檔案時,應在h1行中盡可能多地包含該函數的特征資訊。由于在搜尋路徑上包含average 的函數很多,是以用lookfor average 語句可能會查詢到多個有關的指令。如下。

(3)幫助文本。在函數定義行後面,連續的注釋行不僅可以起到解釋與提示作用,更重要的是為使用者自己的函數檔案建立線上查詢資訊,以供help指令線上查詢時使用。如下。

函數 average_2(x)用以計算向量元素的平均值。

輸入參數x為輸入向量,輸出參數y為計算的平均值。非向量輸入将導緻錯誤。

(4)函數體。函數體包含了全部的用于完成計算及給輸出參數指派等工作的語句,這些語句可以是調用函數、流程控制、互動式輸入/輸出、計算、指派、注釋和空行。

(5)注釋。以%起始到行尾結束的部分為注釋部分,matlab的注釋可以放置在程式的任何位置,可以單獨占一行,也可以在一個語句之後,如

2.4.6 函數調用

調用函數檔案的一般格式如下。

調用函數時應注意以下幾項。

(1)當調用一個函數時,輸入和輸出參數的順序應與函數定義時一緻,其數目可以按少于函數檔案中所規定的輸入和輸出參數調用函數,但不能使用多于函數檔案所規定的輸入和輸出參數數目。如果輸入和輸出參數數目多于或少于函數檔案所允許的數目,則調用時自動傳回錯誤資訊。舉例如下。

(2)在編寫函數檔案調用時常通過nargin、nargout 函數來設定預設輸入參數,并決定使用者所希望的輸出參數。函數nargin 可以檢測函數被調用時使用者指定的輸入參數個數;函數nargout 可以檢測函數被調用時使用者指定的輸出參數個數。

在函數檔案中通過nargin、nargout 函數,可以适應函數被調用時,使用者輸入和輸出參數數目少于函數檔案中function語句所規定數目的情況,以決定采用何種預設輸入參數和使用者所希望的輸出參數。舉例如下。

如果使用者隻指定2個輸入參數調用linspace,例如linspace(0,10),linspace 在0~10之間等間隔産生100個資料點;相反,如果輸入參數的個數是3,例如,linspace(0,10,50),第3個參數決定資料點的個數,linspace 在0~10等間隔産生50個資料點。同樣,函數也可按少于函數檔案中所規定的輸出參數進行調用。例如對函數size( )的調用。

(3)當函數有一個以上輸出參數時,輸出參數包含在方括号内。例如,[m,n]=size(x)。注意:[m,n]在左邊表示函數的兩個輸出參數m和n;不要把它和[m,n]在等号右邊的情況混淆,如y=[m,n]表示數組y由變量m和n所組成。

(4)當函數有一個或多個輸出參數,但調用時未指定輸出參數,則不給輸出變量賦任何值。舉例如下。

如果使用者調用toc 時不指定輸出參數t,舉例如下。

函數在指令視窗顯示函數工作空間變量elapsed_time 的值,但在matlab 指令工作空間裡不給輸出參數t賦任何值,也不建立變量t。

如果使用者調用toc時指定輸出參數t,舉例如下。

則以變量out 的形式傳回到指令視窗,并在matlab指令工作空間裡建立變量out。

(5)函數有自己的獨立工作空間,它與matlab的工作空間分開。除非使用全局變量,函數内變量與matlab其他工作空間之間唯一的聯系是函數的輸入和輸出參數。如果函數任一輸入參數值發生變化,其變化僅在函數内出現,不影響matlab 其他工作空間的變量。函數内所建立的變量隻駐留在該函數工作空間,而且隻在函數執行期間臨時存在,以後就消失。是以,從一個調用到另一個調用,在函數工作空間以變量存儲資訊是不可能的。

(6)在matlab其他工作空間重新定義預定義的變量(例如pi),它不會延伸到函數的工作空間;反之亦然,即在函數内重新定義預定義的變量不會延伸到matlab的其他工作空間中。

(7)如果變量說明是全局的,函數可以與其他函數、matlab的workspace和遞歸調用本身共享變量。為了在函數内或matlab指令工作空間中通路全局變量,全局變量在每一個所希望的工作空間都必須說明。

(8)全局變量可以為程式設計帶來某些友善,但卻破壞了函數對變量的封裝,是以在實際程式設計中,無論什麼時候都應盡量避免使用全局變量。如果一定要用全局變量,建議全局變量名要長、采用大寫字母,并有選擇地以首次出現的m檔案的名字開頭,使全局變量之間不必要的互作用減至最小。

(9)matlab 以搜尋腳本檔案的同樣方式搜尋函數檔案。例如,輸入cow語句,matlab首先認為cow是一個變量;如果它不是,那麼matlab認為它是一個内置函數;如果還不是,matlab檢查目前cow.m 的目錄或檔案夾;如果仍然不是,matlab就檢查cow.m在matlab搜尋路徑上的所有目錄或檔案夾。

(10)從函數檔案内可以調用腳本檔案。在這種情況下,腳本檔案檢視函數工作空間,不檢視matlab的workspace。從函數檔案内調用的腳本檔案不必調到記憶體進行編譯,函數每調用一次,它們就被打開和解釋。是以,從函數檔案内調用腳本檔案減慢了函數的執行。

(11)當函數檔案到達檔案終點,或者碰到傳回指令return,就結束執行和傳回。傳回指令return提供了一種結束函數的簡單方法,而不必到達檔案的終點。

2.4.7 m檔案調試工具

當完成matlab代碼編寫後,使用者就可以在指令視窗運作代碼(腳本或函數檔案)。對于比較簡單的代碼,一般隻要程式設計習慣較好,都可以一次通過,但對于很多比較複雜的情況,或者使用者初學matlab程式設計,一些常見的錯誤還不能避免,容易在運作時出現錯誤,這時候,就需要利用matlab的調試工具對出現錯誤的代碼進行調試糾錯。

matlab的editor視窗是一個綜合了代碼編寫、調試的內建開發環境。matlab代碼調試過程,主要是通過editor視窗上的工具欄完成,如圖2-10所示。

《MATLAB神經網絡超級學習手冊》——2.4 M檔案

下面介紹editor視窗上幾種經常用到的工具。

(1)compare:比較兩個m檔案的差異,并出具報告,報告格式如圖2-11所示。

(2)insert:在m檔案中插入注釋、函數或者資料等。

(3)comment:屏蔽或者取消屏蔽m檔案中的内容。

(4)indent:調整m檔案内容的位置。

(5)run:運作目前m檔案,快捷鍵是f5;目前m檔案設定了斷點時,運作到斷點處暫停。

(6)run section:運作目前m檔案中使用者選中的某一部分程式。

(7)breakpoints:設定或清除斷點。其下拉菜單中的指令如圖2-12所示。

當選擇該選項下拉菜單中的set condition時,會打開條件斷點設定對話框,如圖2-13所示,該指令用于設定滿足斷點有效的條件。

《MATLAB神經網絡超級學習手冊》——2.4 M檔案
《MATLAB神經網絡超級學習手冊》——2.4 M檔案

當選擇stop on errors或stop on warnings指令時,m檔案會在出現某種運作錯誤或警告時,停止程式運作。

通常的調試過程是先單擊run按鈕,運作一遍m檔案,針對系統給出的具體的出錯資訊,在适當的地方設定斷點或條件斷點,再次運作到斷點位置(如圖2-14所示),此時matlab把運作控制權交給鍵盤,指令視窗出現“k>>”提示符(如圖2-15所示),此時可以在指令視窗查詢m檔案運作過程中的所有變量,包括函數運作時的中間變量,運作到斷點位置後,使用者可以逐行運作并實時查詢變量取值,進而逐漸找到錯誤所在并将其排除。

《MATLAB神經網絡超級學習手冊》——2.4 M檔案

2.4.8 m檔案分析工具

通過對m檔案進行調試,可以對檔案中的編寫錯誤和運作錯誤進行糾正。完成了調試後,使用者編寫的m檔案就可以正确地運作了,但可能運作效率還不是最優,這就需要通過matlab提供的分析工具對代碼進行分析,然後有針對性地進行優化。

matlab提供的m檔案分析工具包括code analyzer report工具和profiler工具,它們都有圖形操作界面,使用簡單友善,是matlab程式分析優化的必用工具。

1.code analyzer report工具

code analyzer report工具可以分析使用者m檔案中的錯誤或性能問題,使用者可以先在代碼編輯調試器中打開待分析的m檔案,然後選擇matlab工具菜單下的圖檔 26,即可得到圖2-16所示的代碼分析報告。

《MATLAB神經網絡超級學習手冊》——2.4 M檔案

從圖2-16中可以看出,code analyzer report分析完成後,會傳回一個浏覽器界面下的分析報告,報告中包括被分析的m檔案的路徑,以及若幹個分析結果。分析結果的格式是“行号:錯誤或問題報告”。

實際上,code analyzer report分析得到的報告并不一定必須要消除,要具體問題具體分析。當使用者認可某一條分析結果時,可以單擊分析結果中的行号。就可以快捷打開相應的m檔案并定位到該行,使用者就可以友善地修改代碼了。

code analyzer report不僅可以分析單個m檔案,還可以分析一個檔案夾下的所有m檔案。在分析結果的主界面下,選擇rerun this report則分析單個m檔案,選擇run report on current folder則分析目前檔案夾下的所有m檔案。

2.profiler分析工具

profiler工具是matlab提供的另一個功能強大的代碼分析工具。在matlab的commond window視窗輸入profile viewer指令,出現圖2-17所示的profiler圖形界面。使用時,使用者可以提前在editor中打開m檔案,然後運作profiler分析工具。

《MATLAB神經網絡超級學習手冊》——2.4 M檔案

單擊圖2-17中的“start profiling”按鈕,就可以分析此m檔案,分析結果如圖2-18所示。

《MATLAB神經網絡超級學習手冊》——2.4 M檔案

從圖2-18中可見,profiler分析結果給出了調用函數名稱、調用次數、消耗總時間等資訊,單擊圖2-18中的“self time”,可以使m檔案的分析報告按照self time從大到小的方式排列,如圖2-19所示。

《MATLAB神經網絡超級學習手冊》——2.4 M檔案

圖2-19顯示了檔案運作中最消耗時間的部分及其具體耗時資訊。使用者可以有針對性地修改那些最消耗時間的部分。

一般來說,應該盡量避免不必要的變量輸出,循環指派前預定義數組尺寸,多采用向量化的matlab函數,少采用數組,這些都能夠提高matlab程式的運作性能。

繼續閱讀