ch07.MATLAB2007程序設(shè)計(jì)_第1頁
ch07.MATLAB2007程序設(shè)計(jì)_第2頁
ch07.MATLAB2007程序設(shè)計(jì)_第3頁
ch07.MATLAB2007程序設(shè)計(jì)_第4頁
ch07.MATLAB2007程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、31.07.2020,第1頁,第7章 MATLAB 2007,MATLAB R2007基礎(chǔ)教程,教學(xué)目標(biāo) 教學(xué)重點(diǎn) 教學(xué)內(nèi)容,31.07.2020,第2頁,教學(xué)目標(biāo),熟悉 MATLAB 的編程環(huán)境 掌握 MATLAB 的變量類型 掌握 MATLAB 中的流程控制語句 掌握 MATLAB 的函數(shù)類型和函數(shù)操作 了解 MATLAB 中的錯(cuò)誤處理 了解 MATLAB 程序調(diào)試方法 了解 MATLAB 代碼優(yōu)化方法,31.07.2020,第3頁,教學(xué)重點(diǎn),MATLAB 的編程環(huán)境 MATLAB 的變量類型 MATLAB 中的流程控制語句 MATLAB 的函數(shù)類型和函數(shù)操作 MATLAB 程序調(diào)試方法,

2、31.07.2020,第4頁,教學(xué)內(nèi)容,M文本文件介紹 函數(shù)流程控制 函數(shù)變量 函數(shù)類型 函數(shù)操作 MATLAB 編程錯(cuò)誤處理 程序設(shè)計(jì)的輔助函數(shù) 調(diào)試程序 優(yōu)化程序,31.07.2020,第5頁,M文本文件介紹,一個(gè) M 文件通常包含五個(gè)部分,函數(shù)定義語句、H1 幫助行、幫助文本、函數(shù)體或者腳本文件語句和注釋語句。H1 行為緊隨函數(shù)定義語句后面的一行注釋語句。當(dāng)用戶通過 help 命令查詢?cè)摵瘮?shù)的說明信息時(shí) H1 行顯示為第一行,另外 lookfor 函數(shù)只檢索和顯示 H1 行。幫助文本為 H1 行后面連續(xù)的注釋行,當(dāng)在命令窗口中通過 help 命令查詢?cè)摵瘮?shù)的說明信息時(shí)則在窗口中顯示這些內(nèi)

3、容。函數(shù)體為 M 文件的主要部分,是函數(shù)的執(zhí)行代碼。除上面的 H1 行和幫助文本外,為了易于理解,可以在書寫代碼時(shí)添加注釋語句。這些注釋語句在編譯程序時(shí)會(huì)被忽略,因此不會(huì)影響編譯速度和程序運(yùn)行速度,但是能夠增加程序的可讀性。,31.07.2020,第6頁,一個(gè)完整的 M 文件的結(jié)構(gòu)為: function f = fact(n) 函數(shù)定義語句 % Compute a factorial value. H1 行 % FACT(N) returns the factorial of N, 幫助文本 % usually denoted by N! % Put simply, FACT(N) is PR

4、OD(1:N). 注釋語句 f = prod(1:n); 函數(shù)體 函數(shù)定義語句只在函數(shù)文件中存在,定義函數(shù)名稱、輸入輸出參數(shù)的數(shù)量和順序。函數(shù)定義語句的格式為: function y = fact(x)。,31.07.2020,第7頁,函數(shù)式M文件 函數(shù)式 M 文件比腳本式 M 文件相對(duì)復(fù)雜一些,腳本文件不需要自帶參數(shù),也不一定返回結(jié)果,而函數(shù)文件一般要自帶參數(shù),并且有返回結(jié)果,以便于更好的把整個(gè)程序連為一段。函數(shù)文件也可以不帶參數(shù),此時(shí)文件中一般使用一些全局變量來實(shí)現(xiàn)與外界和其他函數(shù)之間的數(shù)據(jù)交換。 函數(shù)文件的第一行以 function 開始,說明此文件是一個(gè)函數(shù)。其實(shí)質(zhì)為用戶向 MATLA

5、B 函數(shù)庫中添加的子函數(shù)。在默認(rèn)情況下,函數(shù)文件中的變量都是局部變量,僅在函數(shù)運(yùn)行期間有效,函數(shù)運(yùn)行結(jié)束后,這些變量將從工作區(qū)中清除。,31.07.2020,第8頁,函數(shù)流程控制,順序結(jié)構(gòu) 判斷語句(ifelseend) 分支語句 循環(huán)語句 trycatchend語句 其他流程控制函數(shù),31.07.2020,第9頁,順序結(jié)構(gòu),順序結(jié)構(gòu)是最簡(jiǎn)單的程序結(jié)構(gòu),系統(tǒng)在編譯程序時(shí),按照程序的物理位置順序執(zhí)行。這種程序容易編制,但是結(jié)構(gòu)單一,能夠?qū)崿F(xiàn)的功能有限。,31.07.2020,第10頁,判斷語句(ifelseend),ifend ifelseend ifelseifelseend,31.07.20

6、20,第11頁,ifend 此時(shí)的程序結(jié)構(gòu)如下: if 表達(dá)式 執(zhí)行代碼塊 end 這是最簡(jiǎn)單的判斷語句,只有一個(gè)判斷語句,其中的表達(dá)式為邏輯表達(dá)式,當(dāng)表達(dá)式為真時(shí),執(zhí)行相應(yīng)的語句,否則,直接跳到下一段語句。,31.07.2020,第12頁,ifelseend 當(dāng)程序有兩個(gè)選擇時(shí),可以選擇 ifelseend 結(jié)構(gòu),此時(shí)程序結(jié)構(gòu)為: if 表達(dá)式 執(zhí)行代碼塊1 else 執(zhí)行代碼塊2 end 當(dāng)判斷表達(dá)式為真時(shí),執(zhí)行代碼塊1,否則執(zhí)行代碼塊2。,31.07.2020,第13頁,ifelseifelseend 上面的兩種形式中,分別包含一個(gè)選擇和兩個(gè)選擇,當(dāng)判斷包含多個(gè)選擇時(shí),可以采用elsei

7、f 語句,結(jié)構(gòu)為: if 表達(dá)式1 執(zhí)行代碼塊1 elseif 表達(dá)式2 執(zhí)行代碼塊2 elseif . . . else 執(zhí)行代碼塊 end 其中可以包含任意多個(gè) elseif 語句。,31.07.2020,第14頁,分支語句,上一節(jié)中的 ifelseifelseend 語句可以適用于多種選擇的流程控制,此時(shí)對(duì) else之外的每一個(gè)選擇語句設(shè)置一個(gè)表達(dá)式,表達(dá)式為真時(shí)則執(zhí)行該模塊。MATLAB 中的另一種多選擇語句為分支語句。分支語句的結(jié)構(gòu)為: switch 分支語句 case 條件語句 執(zhí)行代碼塊 case 條件語句1, 條件語句2, 條件語句3, . 執(zhí)行代碼塊 otherwise 執(zhí)行

8、代碼塊 end,31.07.2020,第15頁,其中的分支語句為一個(gè)變量,可以是數(shù)值變量或者字符串變量,如果該變量的值與某一條件相符,則執(zhí)行相應(yīng)的語句,否則,執(zhí)行 otherwise 后面的語句。在每一個(gè)條件中,可以包含一個(gè)條件語句,可以包含多個(gè)條件,當(dāng)包含多個(gè)條件時(shí),將條件以單元數(shù)組的形式表示。 MATLAB 的分支語句類似于 C 語言的分支語句,但是又不完全相同:MATLAB 語句從上到下依次判斷條件,條件符合則執(zhí)行相應(yīng)的代碼塊,之后退出該分支語句,因此在代碼塊后面不需要添加“break”語句。,31.07.2020,第16頁,循環(huán)語句,for 語句 while 語句,31.07.2020

9、,第17頁,1for 語句,for 語句將相同的代碼執(zhí)行預(yù)定義的次數(shù)。for 語句的結(jié)構(gòu)為: for 循環(huán)變量 = 表達(dá)式 執(zhí)行代碼塊 end for 循環(huán)的語句在前面的例子中已經(jīng)有所涉及,上節(jié)的例子中,第二個(gè)程序中也涉及到了 for 循環(huán)語句。下面為 for 循環(huán)的更多例子。,31.07.2020,第18頁,2while 語句,while 語句用于將相同的代碼塊執(zhí)行多次,但是次數(shù)并不預(yù)先指定,當(dāng) while 的條件表達(dá)式為真時(shí),執(zhí)行代碼塊,直到條件表達(dá)式為假。while 語句的結(jié)構(gòu)為: while 表達(dá)式 執(zhí)行代碼塊 end,31.07.2020,第19頁,6.2.5 trycatchend

10、語句,MATLAB 中的另一種判斷語句為 trycatch 語句,這種語句可以包容程序運(yùn)行中的錯(cuò)誤,并返回錯(cuò)誤類型。這種語句的結(jié)構(gòu)為: try 運(yùn)行代碼塊 catch 運(yùn)行代碼塊 end 該語句首先從上到下依次執(zhí)行,如果遇到程序錯(cuò)誤則運(yùn)行下一個(gè) catch 中的語句,依次向下進(jìn)行。如果程序運(yùn)行成功,則退出該判斷語句。如果在 catch 和 end之間的程序運(yùn)行出錯(cuò),則程序運(yùn)行終止,或者如果存在其他的 trycatch 結(jié)構(gòu),則運(yùn)行下一個(gè) trycatch 結(jié)構(gòu)。可以利用 lasterr 命令查看發(fā)生錯(cuò)誤的原因。,31.07.2020,第20頁,6.2.6 其他流程控制函數(shù),continue:c

11、ontinue 語句通常用在循環(huán)控制中,包括 for 循環(huán)和 while 循環(huán),用于結(jié)束當(dāng)次循環(huán),繼續(xù)執(zhí)行下一次循環(huán),但是不結(jié)束當(dāng)前循環(huán)。一般 continue 語句與 if 語句相結(jié)合,當(dāng)滿足一定的條件時(shí),執(zhí)行 continue 語句。 break:與 continue 相同的是,break 函數(shù)也是用于循環(huán)控制,中斷當(dāng)前循環(huán)。與 continue 不同,break 跳出當(dāng)前循環(huán),不再執(zhí)行該循環(huán)的任何操作。 return:結(jié)束該程序的執(zhí)行,返回到調(diào)用函數(shù)或者鍵盤。,31.07.2020,第21頁,6.3 函數(shù)變量,6.3.1 變量類型 局部變量 全局變量 永久變量,31.07.2020,第2

12、2頁,局部變量,每個(gè)函數(shù)都有自己的局部變量,這些變量存儲(chǔ)在該函數(shù)獨(dú)立的工作區(qū)中,與其他函數(shù)的變量及主工作區(qū)中的變量分開存儲(chǔ)。當(dāng)函數(shù)調(diào)用結(jié)束時(shí),這些變量隨之刪除,不保存在內(nèi)存中。并且,除了函數(shù)返回值,該函數(shù)不改變工作區(qū)中其他變量的值。 然而腳本文件沒有獨(dú)立的工作區(qū),當(dāng)通過命令窗口調(diào)用腳本文件時(shí),腳本文件分享主工作區(qū),當(dāng)函數(shù)調(diào)用腳本文件時(shí),腳本文件分享主調(diào)函數(shù)的工作區(qū)。需要注意的是,如果腳本中改變了工作區(qū)中變量的值,則在腳本文件調(diào)用結(jié)束后,該變量的值發(fā)生改變。 在函數(shù)中,變量默認(rèn)為局部變量。,31.07.2020,第23頁,全局變量,局部變量只在一個(gè)工作區(qū)內(nèi)有效,無論是函數(shù)工作區(qū)還是 MATLAB

13、 主工作區(qū)。與局部變量不同,全局變量可以在定義該變量的全部工作區(qū)中有效。當(dāng)在一個(gè)工作區(qū)內(nèi)改變?cè)撟兞康闹禃r(shí),該變量在其他工作區(qū)中的變量同時(shí)改變。 任何函數(shù)如果需要使用全局變量,則必須首先聲明,聲明格式為: global 變量名1 變量名2 如果一個(gè) M 文件中包含的子函數(shù)需要訪問全局變量,則需在子函數(shù)中聲明該變量,如果需要在命令行中訪問該變量,則需在命令行中聲明該變量。,31.07.2020,第24頁,永久變量,除局部變量和全局變量外,MATLAB 中還有一種變量類型為永久變量。永久變量的特點(diǎn)為: 只能在 M 文件內(nèi)部定義; 只有該變量從屬的函數(shù)能夠訪問該變量; 當(dāng)函數(shù)運(yùn)行結(jié)束時(shí),該變量的值保留

14、在內(nèi)存中,因此當(dāng)該函數(shù)再次被調(diào)用時(shí),可以再次利用這些變量。 永久變量的定義方法為: persistent 變量名1 變量名2。,31.07.2020,第25頁,6.4 函數(shù)類型,6.4.1 匿名函數(shù) 6.4.2 主函數(shù) 6.4.3 子函數(shù) 6.4.4 嵌套函數(shù) 6.4.5 私有函數(shù) 6.4.6 重載函數(shù),31.07.2020,第26頁,匿名函數(shù),關(guān)于匿名函數(shù)在前面“MATLAB 的數(shù)學(xué)運(yùn)算”一章中已有初步涉及,在“函數(shù)運(yùn)算”一節(jié)的示例中用到了大量的匿名函數(shù)。本節(jié)對(duì)匿名函數(shù)做進(jìn)一步的介紹。 匿名函數(shù)提供了一種創(chuàng)建簡(jiǎn)單程序的方法,使用它用戶可以不必每次都編寫 M 文件。用戶可以在 MATLAB 的

15、命令窗口或是其他任意 M 文件和腳本文件中使用匿名函數(shù)。 匿名函數(shù)的格式為: fhandle = (arglist) expr 其中 fhandle 是為該函數(shù)創(chuàng)建的函數(shù)句柄; 符號(hào)用于創(chuàng)建函數(shù)句柄;arglist 為用逗號(hào)分隔的參數(shù)列表;expr 為函數(shù)主體,為 MATLAB 表達(dá)式。,31.07.2020,第27頁,主函數(shù),通常每個(gè) M 文件中的第一個(gè)函數(shù)為主函數(shù),主函數(shù)可以被該文件之外的其他函數(shù)調(diào)用,而子函數(shù)只能被該文件內(nèi)的函數(shù)調(diào)用。主函數(shù)的調(diào)用通過存儲(chǔ)該函數(shù)的 M 文件的文件名調(diào)用。我們?cè)谇懊鎺坠?jié)中編寫的實(shí)驗(yàn)程序,大多為主函數(shù),如例 6-7。因此,這里不再過多介紹。,31.07.202

16、0,第28頁,子函數(shù),一個(gè) M 文件中可以包括多個(gè)函數(shù),除主函數(shù)之外的其他函數(shù)稱為子函數(shù)。子函數(shù)只能被主函數(shù)或該文件內(nèi)的其他子函數(shù)調(diào)用。每個(gè)子函數(shù)以函數(shù)定義語句開頭,直至下一個(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ù)的名稱。,31.07.2020,第29頁,嵌套函數(shù),一個(gè)函數(shù)內(nèi)部可以定義其他的函數(shù),這種內(nèi)部的函數(shù)稱作嵌套函數(shù)。 1嵌套函數(shù)的書寫 定義嵌套函數(shù)時(shí),只要在一個(gè)函數(shù)內(nèi)部

17、直接定義嵌套函數(shù)即可。需要注意的是當(dāng)一個(gè) M文件中存在嵌套函數(shù)時(shí),該文件內(nèi)的所有函數(shù)必須以 end 結(jié)尾。,31.07.2020,第30頁,例 6-14 嵌套函數(shù)的結(jié)構(gòu) function x = A(p1, p2) . function y = B(p3) . end . end,31.07.2020,第31頁,每個(gè)函數(shù)中可以嵌套多個(gè)函數(shù)。 例 6-15 多個(gè)平行嵌套函數(shù) function x = A(p1, p2) . function y = B(p3) . end function z = C(p4) . end . end,31.07.2020,第32頁,在這個(gè)程序中,函數(shù) A 嵌套了

18、函數(shù) B 和函數(shù) C。另外,嵌套函數(shù)還可以包含嵌套函數(shù),其結(jié)構(gòu)如例 6-16。 例 6-16 多層嵌套函數(shù) function x = A(p1, p2) . function y = B(p3) . function z = C(p4) . end . end . End 在這段程序中,函數(shù) A 嵌套了函數(shù) B,函數(shù) B 嵌套了函數(shù) C。,31.07.2020,第33頁,2嵌套函數(shù)的調(diào)用 一個(gè)嵌套函數(shù)可以被下列函數(shù)調(diào)用: (1)該嵌套函數(shù)的上一層函數(shù),如上面例 6-13 中函數(shù) A 可以調(diào)用函數(shù) B,函數(shù) B 可以調(diào)用函數(shù) C,但是函數(shù) A 不能調(diào)用函數(shù) C; (2)同一母函數(shù)下的同級(jí)嵌套函數(shù)

19、,如上面例 6-12 中函數(shù) B 可以調(diào)用函數(shù) C; (3)被任一低級(jí)別的函數(shù)調(diào)用。,31.07.2020,第34頁,在這段程序中,函數(shù) A 包含了嵌套函數(shù) B 和嵌套函數(shù) D,函數(shù) B 和函數(shù) D 分別嵌套了函數(shù) C 和函數(shù) E。這段程序中函數(shù)間的調(diào)用關(guān)系為: (1)函數(shù) A 為主函數(shù),可以調(diào)用函數(shù) B 和函數(shù) D,但是不能調(diào)用函數(shù) C 和函數(shù) E; (2)函數(shù) B 和函數(shù) D 為一級(jí)嵌套函數(shù),B 可以調(diào)用函數(shù) D 和函數(shù) C,但是不能調(diào)用函數(shù) E;D 可以調(diào)用函數(shù) B 和函數(shù) E,但是不能調(diào)用 C; (3)函數(shù) C 和函數(shù) E 為分屬兩個(gè)函數(shù)的嵌套函數(shù),可以調(diào)用函數(shù) B 和函數(shù) D,但是不

20、能互相調(diào)用。,31.07.2020,第35頁,私有函數(shù),私有函數(shù)是 MATLAB 中的另一類函數(shù),這類函數(shù)位于名為“private”的子文件夾中,只能被上一級(jí)文件夾中的函數(shù)或者這些函數(shù)所調(diào)用的 M 文件調(diào)用。如,當(dāng)前文件夾為 matlabmath,matlabmath 中包含子文件夾 private,則 private 中的函數(shù)只能被 matlabmath 根目錄下的函數(shù)及這些函數(shù)調(diào)用的 M 文件調(diào)用。 私有函數(shù)只能被其父文件夾中的函數(shù)調(diào)用,因此,用戶可以開發(fā)自己的函數(shù)庫,函數(shù)的名稱可以與系統(tǒng)標(biāo)準(zhǔn) M 函數(shù)庫名稱相同,而不必?fù)?dān)心在函數(shù)調(diào)用時(shí)發(fā)生沖突,因?yàn)?MATLAB 首先查找私有函數(shù),再查找

21、標(biāo)準(zhǔn)函數(shù)。,31.07.2020,第36頁,重載函數(shù),函數(shù)重載為程序編寫和用戶調(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í)行。,31.07.2020,第37頁,函數(shù)操作,函數(shù)句柄 利用函數(shù)句柄可以實(shí)現(xiàn)對(duì)函數(shù)的間接操作,可以通過將函數(shù)句柄傳遞給其他函數(shù)實(shí)現(xiàn)對(duì)函數(shù)的操作,也可以將函數(shù)句柄保存在變量中,留待以后調(diào)用操作。 函數(shù)句柄是通過 符號(hào)創(chuàng)建的,格式為: fhandle = functionname。,31.07.2020,第38頁,若要保存函數(shù)句柄,可以使用單元數(shù)組,如下: trigFun = sin

22、, cos, tan; 通過函數(shù)句柄實(shí)現(xiàn)對(duì)函數(shù)的間接調(diào)用,其調(diào)用格式與直接調(diào)用函數(shù)的格式相同:fhandle(arg1, arg2, ., argn),其中 fhandle 為函數(shù)句柄。,31.07.2020,第39頁,函數(shù)參數(shù),當(dāng)調(diào)用函數(shù)時(shí),主調(diào)函數(shù)通過函數(shù)參數(shù)的形式向被調(diào)函數(shù)傳遞數(shù)據(jù),被調(diào)函數(shù)通過函數(shù)返回值的形式向主調(diào)函數(shù)返回?cái)?shù)據(jù)。本節(jié)介紹函數(shù)參數(shù),內(nèi)容包括:輸入?yún)?shù)數(shù)目確定、輸入可變數(shù)目的參數(shù)、向嵌套函數(shù)輸入可選參數(shù)和修改參數(shù)值并返回。,31.07.2020,第40頁,1函數(shù)參數(shù)數(shù)目確定 函數(shù) nargin 和函數(shù) nargout 分別用于確定函數(shù)的輸入輸出參數(shù)個(gè)數(shù)。在函數(shù)體內(nèi)部用 na

23、rgin(nargout)確定輸入輸出參數(shù)后可以用條件語句確定需要執(zhí)行的操作。,31.07.2020,第41頁,函數(shù) nargin 和函數(shù) nargout 允許函數(shù)接收或返回任意數(shù)目的參數(shù)。本節(jié)介紹參數(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ù)。見下面的例子。,31.07.2020,第42頁,在調(diào)用該函數(shù)時(shí)可以輸入任意數(shù)目的參數(shù),參數(shù)可以為二元數(shù)組或者表示線型的字符串,該函數(shù)將用指定的線型繪制輸入數(shù)據(jù)的

24、圖像。指定線型的字符串可以在任意位置輸入,并且可以輸入多個(gè),但是需要注意的是,只有最后一個(gè)字符串起作用。 在上面的程序中,將所有輸入?yún)?shù)作為一個(gè)單元數(shù)組,利用花括號(hào)和圓括號(hào)對(duì)數(shù)組元素進(jìn)行訪問,實(shí)現(xiàn)輸入?yún)?shù)的調(diào)用。,31.07.2020,第43頁,在嵌套函數(shù)中也可以使用可變參數(shù)。但是需要注意的是,varargin、varargout、nargin 和 nargout 的意義可能有所不同。下面介紹這四個(gè)元素的應(yīng)用規(guī)則。 varargin 和 varargout 這兩個(gè)元素為變量,與 MATLAB 其他變量的作用范圍相同。由于嵌套函數(shù)與主函數(shù)使用相同的工作區(qū),因此 varargin 和 vararg

25、out 既可以表示嵌套函數(shù)的輸入輸出參數(shù),也可以是主函數(shù)的輸入輸出函數(shù),具體值取決于程序中的變量聲明: 如果嵌套函數(shù)在函數(shù)聲明中包含 varargin 或者 varargout,則在該函數(shù)內(nèi)部調(diào)用這兩個(gè)變量時(shí),變量?jī)?nèi)容為該函數(shù)的輸入輸出參數(shù); 如果嵌套函數(shù)聲明中沒有包含 varargin 或者 varargout,而在該函數(shù)的上層函數(shù)聲明中包含 varargin 或者 varargout,則當(dāng)在該嵌套函數(shù)內(nèi)部調(diào)用這兩個(gè)變量時(shí),變量?jī)?nèi)容為上層函數(shù)的輸入輸出參數(shù)。,31.07.2020,第44頁,nargin 和 nargout nargin 和 nargout 是函數(shù),當(dāng)在函數(shù)中調(diào)用這兩個(gè)函數(shù)時(shí)

26、,其值為該函數(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ù)。,31.07.2020,第45頁,MATLAB 編程錯(cuò)誤處理,通過 try-catch 語句檢測(cè)錯(cuò)誤 對(duì)錯(cuò)誤進(jìn)行處理并且從錯(cuò)誤中恢復(fù) 消息標(biāo)志符 警告處理,31.07.2020,第46頁,通過 try-catch 語句檢測(cè)錯(cuò)誤,無論程序的編寫多么謹(jǐn)慎,在不同的環(huán)境下運(yùn)行時(shí)都有可能產(chǎn)生意外的錯(cuò)誤。因此,有必要在程序中添加錯(cuò)誤檢測(cè)語句,保證程序在所有的條件下都能

27、夠正常運(yùn)行。 MATLAB 中的 try-catch 語句可用于錯(cuò)誤檢測(cè)。如果程序中的一些語句可能會(huì)產(chǎn)生非預(yù)計(jì)的結(jié)果,可以將這些語句放在 try-catch 塊中。try-catch 語句可以檢測(cè)所有錯(cuò)誤,并且分別進(jìn)行處理。格式如下: try 表達(dá)式1 catch 表達(dá)式2 end 一個(gè) try-catch 塊分為兩個(gè)部分。第一個(gè)部分以 try 開始,第二個(gè)部分以 catch 開始,整個(gè)塊以 end 結(jié)束。程序首先正常執(zhí)行第一部分,如果有錯(cuò)誤發(fā)生,則停止執(zhí)行該部分的其他語句,轉(zhuǎn)而執(zhí)行 catch 中的語句。catch 部分對(duì)錯(cuò)誤進(jìn)行處理,可以顯示錯(cuò)誤提示、執(zhí)行默認(rèn)語句等。,31.07.2020

28、,第47頁,在 try-catch 語句中,可以嵌套其他的 try-catch 語句,其格式為: try 表達(dá)式 1 % 執(zhí)行表達(dá)式 1 catch try 表達(dá)式 2 % 嘗試從錯(cuò)誤中恢復(fù) catch disp Operation failed % 處理錯(cuò)誤 end end,31.07.2020,第48頁,對(duì)錯(cuò)誤進(jìn)行處理并且從錯(cuò)誤中恢復(fù),1發(fā)出錯(cuò)誤報(bào)告 MATALB 中 error 函數(shù)可以報(bào)告錯(cuò)誤并且中斷程序運(yùn)行。用戶可以通過指定 error 函數(shù)參數(shù)的方式指定將要發(fā)出的錯(cuò)誤信息。,31.07.2020,第49頁,2識(shí)別錯(cuò)誤發(fā)生的原因 當(dāng)錯(cuò)誤發(fā)生時(shí),用戶需要知道錯(cuò)誤發(fā)生的位置及錯(cuò)誤原因,以

29、便能夠正確處理錯(cuò)誤。lasterror 函數(shù)可以返回最后發(fā)生的錯(cuò)誤的相關(guān)信息,輔助用戶識(shí)別錯(cuò)誤。 lasterror 返回結(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ù)。,31.07.2020,第50頁,3錯(cuò)誤重現(xiàn) 在一些情況下,需要重現(xiàn)已經(jīng)拋出過的錯(cuò)誤,以便于對(duì)錯(cuò)

30、誤進(jìn)行分析。MATLAB 中函數(shù) rethrow 可以重新拋出指定的錯(cuò)誤。該函數(shù)的格式為 rethrow(err),其中輸入?yún)?shù) err 用于指定需要重現(xiàn)的錯(cuò)誤。該語句執(zhí)行后程序運(yùn)行中斷,將控制權(quán)轉(zhuǎn)給鍵盤或 catch 語句的上一層模塊。輸入?yún)?shù) err 需為 MATLAB 結(jié)構(gòu)體,包含 message、identifier、stack 中至少一個(gè)域,這三個(gè)域的類型與 lasterror 返回結(jié)果相同。 rethrow 函數(shù)通常與 try-catch 語句一起使用。如: try 表達(dá)式 1 catch do_cleanup rethrow(lasterror) end,31.07.2020,第

31、51頁,消息標(biāo)志符,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ì)信

32、息用于指定消息的具體內(nèi)容,如除數(shù)為 0 等。 如下面的例子為一個(gè)完整的標(biāo)志符: error(MATLAB:ambiguousSyntax, Syntax %s could be ambiguous.n, inputstr)。,31.07.2020,第52頁,2標(biāo)志符的應(yīng)用 消息標(biāo)志符通常與 lasterror 函數(shù)一起應(yīng)用,使得 lasterror 函數(shù)和 lasterr 函數(shù)能夠識(shí)別錯(cuò)誤的原因。lasterror 函數(shù)和 lasterr 函數(shù)返回消息標(biāo)志符,用戶可以通過其類別信息和詳細(xì)信息分別獲取錯(cuò)誤的總體類別及具體信息。 使用消息標(biāo)志符的第一步為確定目的信息并為其指定標(biāo)志符。消息標(biāo)志符通過

33、 error 函數(shù)指定,格式為: error(msg_id, errormsg) error(msg_id, formatted_errormsg, arg1, arg2, .) 其中的消息標(biāo)志符可以省略。如果 lasterror 函數(shù)不使用該信息,上面的語句可以簡(jiǎn)寫為: error(errormsg) 下面以兩個(gè)實(shí)例說明消息標(biāo)志符與 lasterror 的使用。,31.07.2020,第53頁,31.07.2020,第54頁,警告處理,警告用于提示用戶在程序運(yùn)行中出現(xiàn)異常情況。與錯(cuò)誤不同的是,警告并不中斷程序的運(yùn)行,而是顯示警告內(nèi)容并繼續(xù)執(zhí)行。警告通過函數(shù) warning 發(fā)出,格式與 er

34、ror 函數(shù)相同,如: warning(Input must be a string) warning(formatted_warningmsg, arg1, arg2, .) warning(Ambiguous parameter name, %s., param) 另外,與錯(cuò)誤相同,警告也可以使用消息標(biāo)志符,用以顯示該警告信息的類別及具體信息。警告處理的方式與錯(cuò)誤處理的方式類似這里不再贅述。,31.07.2020,第55頁,程序設(shè)計(jì)的輔助函數(shù),表達(dá)式與函數(shù)的評(píng)估 計(jì)時(shí)器函數(shù),31.07.2020,第56頁,31.07.2020,第57頁,計(jì)時(shí)器函數(shù),31.07.2020,第58頁,調(diào)試程序

35、,直接調(diào)試法 利用調(diào)試工具 采用命令行調(diào)試程序 采用調(diào)試界面調(diào)試程序,31.07.2020,第59頁,直接調(diào)試法,MATLAB 語言具有強(qiáng)大的運(yùn)算能力,指令系統(tǒng)簡(jiǎn)單,因此程序通常非常簡(jiǎn)潔。對(duì)于簡(jiǎn)單的程序可以采用直接調(diào)試的方法。 在程序調(diào)試時(shí),程序運(yùn)行中變量的值為一個(gè)重要的線索。因此,查看變量值為程序調(diào)試的重要線索,由于在函數(shù)調(diào)用時(shí)只返回最后的輸出參數(shù),而不返回中間變量,因此,可以選擇下面的方法查看程序運(yùn)行中的變量值。 (1)通過分析后,將可能出錯(cuò)的語句后面的分號(hào)(;)刪除,將結(jié)果顯示在命令窗口中,與預(yù)期值進(jìn)行比較; (2)利用函數(shù) disp 顯示中間變量的值; (3)在程序中的適當(dāng)位置添加 k

36、eyboard 指令。當(dāng) MATLAB 執(zhí)行至此處時(shí)將暫停,等待用戶反應(yīng)。當(dāng)程序運(yùn)行至此時(shí)將暫停,在命令窗口中顯示 k提示符,用戶可以查看工作區(qū)中的變量,可以改變變量的值。輸入 return 指定返回程序,繼續(xù)運(yùn)行。 (4)在調(diào)試一個(gè)單獨(dú)的函數(shù)時(shí),可以將函數(shù)改寫為腳本文件,此時(shí)可以直接對(duì)輸入?yún)?shù)賦值,然后以腳本方式運(yùn)行該 M 文件,這樣可以保存中間變量,在運(yùn)行完成后,可以查看中間變量的值,對(duì)結(jié)果進(jìn)行分析,查找錯(cuò)誤所在。,31.07.2020,第60頁,采用命令行調(diào)試程序,31.07.2020,第61頁,31.07.2020,第62頁,文本編輯器中的 Debug 菜單提供了全部的調(diào)試選項(xiàng),另外,

37、MATLAB 主窗口中的 Debug 菜單提供了一些調(diào)試命令,方便調(diào)試時(shí)在命令窗口中查看運(yùn)行狀態(tài)。調(diào)試選項(xiàng)及其功能如表所示。,31.07.2020,第63頁,Set/Clear Breakpoint,設(shè)置或清除斷點(diǎn)??梢赃x擇該選項(xiàng)對(duì)當(dāng)前行進(jìn)行操作,或者通過快捷鍵 F12,或者直接點(diǎn)擊該行左側(cè)的“-”,如圖所示。 設(shè)置斷點(diǎn)時(shí)該處顯示為紅點(diǎn)。再次進(jìn)行相同的操作則刪除該斷點(diǎn)。,31.07.2020,第64頁,Set/Modify Conditional Breakpoint,該選項(xiàng)用于設(shè)置或修改條件斷點(diǎn)。條件斷點(diǎn)為一種特殊的斷點(diǎn),當(dāng)滿足指定的條件時(shí)則程序執(zhí)行至此時(shí)停止,條件不滿足時(shí)則程序繼續(xù)進(jìn)行。其

38、設(shè)置界面如圖 6-6所示,在輸入框中輸入斷點(diǎn)條件則將當(dāng)前行設(shè)置為條件斷點(diǎn)。,31.07.2020,第65頁,Enable/Disable Breakpoint,該選項(xiàng)用于開啟或關(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)在命令窗口中輸入該變量的變量名,則顯示該變量的值。 本節(jié)介紹了程序調(diào)試的函

39、數(shù)和工具,在真正編寫程序時(shí),需要根據(jù)不同的情況靈活應(yīng)用這些功能,達(dá)到最高的調(diào)試效率。,31.07.2020,第66頁,優(yōu)化程序,通過 Profiler 進(jìn)行程序運(yùn)行分析 通過 tic、toc 函數(shù)進(jìn)行程序運(yùn)行分析 程序優(yōu)化的常用方法,31.07.2020,第67頁,通過 Profiler 進(jìn)行程序運(yùn)行分析,Profiler 工具為 MATLAB 中的圖形用戶接口,用于分析程序運(yùn)行時(shí)各個(gè)部分所消耗的時(shí)間,輔助用戶進(jìn)行程序優(yōu)化。通過 Profiler,用戶可以: 避免由于疏忽造成的非必要操作 替換運(yùn)算較慢的算法,選擇快速算法 通過存儲(chǔ)變量的方式避免重復(fù)計(jì)算 通過 Profiler 工具進(jìn)行程序運(yùn)行分析通常按照下面的步驟進(jìn)行: (1)查看 Profiler 生成的總體報(bào)告,查找運(yùn)行時(shí)間最多的函數(shù)或調(diào)用最頻繁的函數(shù)。 (2)查看這些函數(shù)的詳細(xì)報(bào)告,查找其中運(yùn)行時(shí)間最多的語句或調(diào)用最頻繁的語句。用戶可以保存第一次分析的結(jié)果,以便

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論