![ch07.MATLAB2007程序設(shè)計(jì)_第1頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-7/31/48592ea7-b7dc-471f-9d58-aee9b4292100/48592ea7-b7dc-471f-9d58-aee9b42921001.gif)
![ch07.MATLAB2007程序設(shè)計(jì)_第2頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-7/31/48592ea7-b7dc-471f-9d58-aee9b4292100/48592ea7-b7dc-471f-9d58-aee9b42921002.gif)
![ch07.MATLAB2007程序設(shè)計(jì)_第3頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-7/31/48592ea7-b7dc-471f-9d58-aee9b4292100/48592ea7-b7dc-471f-9d58-aee9b42921003.gif)
![ch07.MATLAB2007程序設(shè)計(jì)_第4頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-7/31/48592ea7-b7dc-471f-9d58-aee9b4292100/48592ea7-b7dc-471f-9d58-aee9b42921004.gif)
![ch07.MATLAB2007程序設(shè)計(jì)_第5頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-7/31/48592ea7-b7dc-471f-9d58-aee9b4292100/48592ea7-b7dc-471f-9d58-aee9b42921005.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、31.07.2020,第1頁(yè),第7章 MATLAB 2007,MATLAB R2007基礎(chǔ)教程,教學(xué)目標(biāo) 教學(xué)重點(diǎn) 教學(xué)內(nèi)容,31.07.2020,第2頁(yè),教學(xué)目標(biāo),熟悉 MATLAB 的編程環(huán)境 掌握 MATLAB 的變量類型 掌握 MATLAB 中的流程控制語(yǔ)句 掌握 MATLAB 的函數(shù)類型和函數(shù)操作 了解 MATLAB 中的錯(cuò)誤處理 了解 MATLAB 程序調(diào)試方法 了解 MATLAB 代碼優(yōu)化方法,31.07.2020,第3頁(yè),教學(xué)重點(diǎn),MATLAB 的編程環(huán)境 MATLAB 的變量類型 MATLAB 中的流程控制語(yǔ)句 MATLAB 的函數(shù)類型和函數(shù)操作 MATLAB 程序調(diào)試方法,
2、31.07.2020,第4頁(yè),教學(xué)內(nèi)容,M文本文件介紹 函數(shù)流程控制 函數(shù)變量 函數(shù)類型 函數(shù)操作 MATLAB 編程錯(cuò)誤處理 程序設(shè)計(jì)的輔助函數(shù) 調(diào)試程序 優(yōu)化程序,31.07.2020,第5頁(yè),M文本文件介紹,一個(gè) M 文件通常包含五個(gè)部分,函數(shù)定義語(yǔ)句、H1 幫助行、幫助文本、函數(shù)體或者腳本文件語(yǔ)句和注釋語(yǔ)句。H1 行為緊隨函數(shù)定義語(yǔ)句后面的一行注釋語(yǔ)句。當(dāng)用戶通過(guò) help 命令查詢?cè)摵瘮?shù)的說(shuō)明信息時(shí) H1 行顯示為第一行,另外 lookfor 函數(shù)只檢索和顯示 H1 行。幫助文本為 H1 行后面連續(xù)的注釋行,當(dāng)在命令窗口中通過(guò) help 命令查詢?cè)摵瘮?shù)的說(shuō)明信息時(shí)則在窗口中顯示這些內(nèi)
3、容。函數(shù)體為 M 文件的主要部分,是函數(shù)的執(zhí)行代碼。除上面的 H1 行和幫助文本外,為了易于理解,可以在書寫代碼時(shí)添加注釋語(yǔ)句。這些注釋語(yǔ)句在編譯程序時(shí)會(huì)被忽略,因此不會(huì)影響編譯速度和程序運(yùn)行速度,但是能夠增加程序的可讀性。,31.07.2020,第6頁(yè),一個(gè)完整的 M 文件的結(jié)構(gòu)為: function f = fact(n) 函數(shù)定義語(yǔ)句 % 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). 注釋語(yǔ)句 f = prod(1:n); 函數(shù)體 函數(shù)定義語(yǔ)句只在函數(shù)文件中存在,定義函數(shù)名稱、輸入輸出參數(shù)的數(shù)量和順序。函數(shù)定義語(yǔ)句的格式為: function y = fact(x)。,31.07.2020,第7頁(yè),函數(shù)式M文件 函數(shù)式 M 文件比腳本式 M 文件相對(duì)復(fù)雜一些,腳本文件不需要自帶參數(shù),也不一定返回結(jié)果,而函數(shù)文件一般要自帶參數(shù),并且有返回結(jié)果,以便于更好的把整個(gè)程序連為一段。函數(shù)文件也可以不帶參數(shù),此時(shí)文件中一般使用一些全局變量來(lái)實(shí)現(xiàn)與外界和其他函數(shù)之間的數(shù)據(jù)交換。 函數(shù)文件的第一行以 function 開(kāi)始,說(shuō)明此文件是一個(gè)函數(shù)。其實(shí)質(zhì)為用戶向 MATLA
5、B 函數(shù)庫(kù)中添加的子函數(shù)。在默認(rèn)情況下,函數(shù)文件中的變量都是局部變量,僅在函數(shù)運(yùn)行期間有效,函數(shù)運(yùn)行結(jié)束后,這些變量將從工作區(qū)中清除。,31.07.2020,第8頁(yè),函數(shù)流程控制,順序結(jié)構(gòu) 判斷語(yǔ)句(ifelseend) 分支語(yǔ)句 循環(huán)語(yǔ)句 trycatchend語(yǔ)句 其他流程控制函數(shù),31.07.2020,第9頁(yè),順序結(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頁(yè),判斷語(yǔ)句(ifelseend),ifend ifelseend ifelseifelseend,31.07.20
6、20,第11頁(yè),ifend 此時(shí)的程序結(jié)構(gòu)如下: if 表達(dá)式 執(zhí)行代碼塊 end 這是最簡(jiǎn)單的判斷語(yǔ)句,只有一個(gè)判斷語(yǔ)句,其中的表達(dá)式為邏輯表達(dá)式,當(dāng)表達(dá)式為真時(shí),執(zhí)行相應(yīng)的語(yǔ)句,否則,直接跳到下一段語(yǔ)句。,31.07.2020,第12頁(yè),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頁(yè),ifelseifelseend 上面的兩種形式中,分別包含一個(gè)選擇和兩個(gè)選擇,當(dāng)判斷包含多個(gè)選擇時(shí),可以采用elsei
7、f 語(yǔ)句,結(jié)構(gòu)為: if 表達(dá)式1 執(zhí)行代碼塊1 elseif 表達(dá)式2 執(zhí)行代碼塊2 elseif . . . else 執(zhí)行代碼塊 end 其中可以包含任意多個(gè) elseif 語(yǔ)句。,31.07.2020,第14頁(yè),分支語(yǔ)句,上一節(jié)中的 ifelseifelseend 語(yǔ)句可以適用于多種選擇的流程控制,此時(shí)對(duì) else之外的每一個(gè)選擇語(yǔ)句設(shè)置一個(gè)表達(dá)式,表達(dá)式為真時(shí)則執(zhí)行該模塊。MATLAB 中的另一種多選擇語(yǔ)句為分支語(yǔ)句。分支語(yǔ)句的結(jié)構(gòu)為: switch 分支語(yǔ)句 case 條件語(yǔ)句 執(zhí)行代碼塊 case 條件語(yǔ)句1, 條件語(yǔ)句2, 條件語(yǔ)句3, . 執(zhí)行代碼塊 otherwise 執(zhí)行
8、代碼塊 end,31.07.2020,第15頁(yè),其中的分支語(yǔ)句為一個(gè)變量,可以是數(shù)值變量或者字符串變量,如果該變量的值與某一條件相符,則執(zhí)行相應(yīng)的語(yǔ)句,否則,執(zhí)行 otherwise 后面的語(yǔ)句。在每一個(gè)條件中,可以包含一個(gè)條件語(yǔ)句,可以包含多個(gè)條件,當(dāng)包含多個(gè)條件時(shí),將條件以單元數(shù)組的形式表示。 MATLAB 的分支語(yǔ)句類似于 C 語(yǔ)言的分支語(yǔ)句,但是又不完全相同:MATLAB 語(yǔ)句從上到下依次判斷條件,條件符合則執(zhí)行相應(yīng)的代碼塊,之后退出該分支語(yǔ)句,因此在代碼塊后面不需要添加“break”語(yǔ)句。,31.07.2020,第16頁(yè),循環(huán)語(yǔ)句,for 語(yǔ)句 while 語(yǔ)句,31.07.2020
9、,第17頁(yè),1for 語(yǔ)句,for 語(yǔ)句將相同的代碼執(zhí)行預(yù)定義的次數(shù)。for 語(yǔ)句的結(jié)構(gòu)為: for 循環(huán)變量 = 表達(dá)式 執(zhí)行代碼塊 end for 循環(huán)的語(yǔ)句在前面的例子中已經(jīng)有所涉及,上節(jié)的例子中,第二個(gè)程序中也涉及到了 for 循環(huán)語(yǔ)句。下面為 for 循環(huán)的更多例子。,31.07.2020,第18頁(yè),2while 語(yǔ)句,while 語(yǔ)句用于將相同的代碼塊執(zhí)行多次,但是次數(shù)并不預(yù)先指定,當(dāng) while 的條件表達(dá)式為真時(shí),執(zhí)行代碼塊,直到條件表達(dá)式為假。while 語(yǔ)句的結(jié)構(gòu)為: while 表達(dá)式 執(zhí)行代碼塊 end,31.07.2020,第19頁(yè),6.2.5 trycatchend
10、語(yǔ)句,MATLAB 中的另一種判斷語(yǔ)句為 trycatch 語(yǔ)句,這種語(yǔ)句可以包容程序運(yùn)行中的錯(cuò)誤,并返回錯(cuò)誤類型。這種語(yǔ)句的結(jié)構(gòu)為: try 運(yùn)行代碼塊 catch 運(yùn)行代碼塊 end 該語(yǔ)句首先從上到下依次執(zhí)行,如果遇到程序錯(cuò)誤則運(yùn)行下一個(gè) catch 中的語(yǔ)句,依次向下進(jìn)行。如果程序運(yùn)行成功,則退出該判斷語(yǔ)句。如果在 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頁(yè),6.2.6 其他流程控制函數(shù),continue:c
11、ontinue 語(yǔ)句通常用在循環(huán)控制中,包括 for 循環(huán)和 while 循環(huán),用于結(jié)束當(dāng)次循環(huán),繼續(xù)執(zhí)行下一次循環(huán),但是不結(jié)束當(dāng)前循環(huán)。一般 continue 語(yǔ)句與 if 語(yǔ)句相結(jié)合,當(dāng)滿足一定的條件時(shí),執(zhí)行 continue 語(yǔ)句。 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頁(yè),6.3 函數(shù)變量,6.3.1 變量類型 局部變量 全局變量 永久變量,31.07.2020,第2
12、2頁(yè),局部變量,每個(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ù)中,變量默認(rèn)為局部變量。,31.07.2020,第23頁(yè),全局變量,局部變量只在一個(gè)工作區(qū)內(nèi)有效,無(wú)論是函數(shù)工作區(qū)還是 MATLAB
13、 主工作區(qū)。與局部變量不同,全局變量可以在定義該變量的全部工作區(qū)中有效。當(dāng)在一個(gè)工作區(qū)內(nèi)改變?cè)撟兞康闹禃r(shí),該變量在其他工作區(qū)中的變量同時(shí)改變。 任何函數(shù)如果需要使用全局變量,則必須首先聲明,聲明格式為: global 變量名1 變量名2 如果一個(gè) M 文件中包含的子函數(shù)需要訪問(wèn)全局變量,則需在子函數(shù)中聲明該變量,如果需要在命令行中訪問(wèn)該變量,則需在命令行中聲明該變量。,31.07.2020,第24頁(yè),永久變量,除局部變量和全局變量外,MATLAB 中還有一種變量類型為永久變量。永久變量的特點(diǎn)為: 只能在 M 文件內(nèi)部定義; 只有該變量從屬的函數(shù)能夠訪問(wèn)該變量; 當(dāng)函數(shù)運(yùn)行結(jié)束時(shí),該變量的值保留
14、在內(nèi)存中,因此當(dāng)該函數(shù)再次被調(diào)用時(shí),可以再次利用這些變量。 永久變量的定義方法為: persistent 變量名1 變量名2。,31.07.2020,第25頁(yè),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頁(yè),匿名函數(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頁(yè),主函數(shù),通常每個(gè) M 文件中的第一個(gè)函數(shù)為主函數(shù),主函數(shù)可以被該文件之外的其他函數(shù)調(diào)用,而子函數(shù)只能被該文件內(nèi)的函數(shù)調(diào)用。主函數(shù)的調(diào)用通過(guò)存儲(chǔ)該函數(shù)的 M 文件的文件名調(diào)用。我們?cè)谇懊鎺坠?jié)中編寫的實(shí)驗(yàn)程序,大多為主函數(shù),如例 6-7。因此,這里不再過(guò)多介紹。,31.07.202
16、0,第28頁(yè),子函數(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ù)的名稱。,31.07.2020,第29頁(yè),嵌套函數(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頁(yè),例 6-14 嵌套函數(shù)的結(jié)構(gòu) function x = A(p1, p2) . function y = B(p3) . end . end,31.07.2020,第31頁(yè),每個(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頁(yè),在這個(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頁(yè),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頁(yè),在這段程序中,函數(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頁(yè),私有函數(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)用,因此,用戶可以開(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)?MATLAB 首先查找私有函數(shù),再查找
21、標(biāo)準(zhǔn)函數(shù)。,31.07.2020,第36頁(yè),重載函數(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頁(yè),函數(shù)操作,函數(shù)句柄 利用函數(shù)句柄可以實(shí)現(xiàn)對(duì)函數(shù)的間接操作,可以通過(guò)將函數(shù)句柄傳遞給其他函數(shù)實(shí)現(xiàn)對(duì)函數(shù)的操作,也可以將函數(shù)句柄保存在變量中,留待以后調(diào)用操作。 函數(shù)句柄是通過(guò) 符號(hào)創(chuàng)建的,格式為: fhandle = functionname。,31.07.2020,第38頁(yè),若要保存函數(shù)句柄,可以使用單元數(shù)組,如下: trigFun = sin
22、, cos, tan; 通過(guò)函數(shù)句柄實(shí)現(xiàn)對(duì)函數(shù)的間接調(diào)用,其調(diào)用格式與直接調(diào)用函數(shù)的格式相同:fhandle(arg1, arg2, ., argn),其中 fhandle 為函數(shù)句柄。,31.07.2020,第39頁(yè),函數(shù)參數(shù),當(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ù)。本節(jié)介紹函數(shù)參數(shù),內(nèi)容包括:輸入?yún)?shù)數(shù)目確定、輸入可變數(shù)目的參數(shù)、向嵌套函數(shù)輸入可選參數(shù)和修改參數(shù)值并返回。,31.07.2020,第40頁(yè),1函數(shù)參數(shù)數(shù)目確定 函數(shù) nargin 和函數(shù) nargout 分別用于確定函數(shù)的輸入輸出參數(shù)個(gè)數(shù)。在函數(shù)體內(nèi)部用 na
23、rgin(nargout)確定輸入輸出參數(shù)后可以用條件語(yǔ)句確定需要執(zhí)行的操作。,31.07.2020,第41頁(yè),函數(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ù)。見(jiàn)下面的例子。,31.07.2020,第42頁(yè),在調(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)行訪問(wèn),實(shí)現(xiàn)輸入?yún)?shù)的調(diào)用。,31.07.2020,第43頁(yè),在嵌套函數(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ù)聲明中沒(méi)有包含 varargin 或者 varargout,而在該函數(shù)的上層函數(shù)聲明中包含 varargin 或者 varargout,則當(dāng)在該嵌套函數(shù)內(nèi)部調(diào)用這兩個(gè)變量時(shí),變量?jī)?nèi)容為上層函數(shù)的輸入輸出參數(shù)。,31.07.2020,第44頁(yè),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頁(yè),MATLAB 編程錯(cuò)誤處理,通過(guò) try-catch 語(yǔ)句檢測(cè)錯(cuò)誤 對(duì)錯(cuò)誤進(jìn)行處理并且從錯(cuò)誤中恢復(fù) 消息標(biāo)志符 警告處理,31.07.2020,第46頁(yè),通過(guò) try-catch 語(yǔ)句檢測(cè)錯(cuò)誤,無(wú)論程序的編寫多么謹(jǐn)慎,在不同的環(huán)境下運(yùn)行時(shí)都有可能產(chǎn)生意外的錯(cuò)誤。因此,有必要在程序中添加錯(cuò)誤檢測(cè)語(yǔ)句,保證程序在所有的條件下都能
27、夠正常運(yùn)行。 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 塊分為兩個(gè)部分。第一個(gè)部分以 try 開(kāi)始,第二個(gè)部分以 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ǔ)句等。,31.07.2020
28、,第47頁(yè),在 try-catch 語(yǔ)句中,可以嵌套其他的 try-catch 語(yǔ)句,其格式為: try 表達(dá)式 1 % 執(zhí)行表達(dá)式 1 catch try 表達(dá)式 2 % 嘗試從錯(cuò)誤中恢復(fù) catch disp Operation failed % 處理錯(cuò)誤 end end,31.07.2020,第48頁(yè),對(duì)錯(cuò)誤進(jìn)行處理并且從錯(cuò)誤中恢復(fù),1發(fā)出錯(cuò)誤報(bào)告 MATALB 中 error 函數(shù)可以報(bào)告錯(cuò)誤并且中斷程序運(yùn)行。用戶可以通過(guò)指定 error 函數(shù)參數(shù)的方式指定將要發(fā)出的錯(cuò)誤信息。,31.07.2020,第49頁(yè),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頁(yè),3錯(cuò)誤重現(xiàn) 在一些情況下,需要重現(xiàn)已經(jīng)拋出過(guò)的錯(cuò)誤,以便于對(duì)錯(cuò)
30、誤進(jìn)行分析。MATLAB 中函數(shù) rethrow 可以重新拋出指定的錯(cuò)誤。該函數(shù)的格式為 rethrow(err),其中輸入?yún)?shù) err 用于指定需要重現(xiàn)的錯(cuò)誤。該語(yǔ)句執(zhí)行后程序運(yùn)行中斷,將控制權(quán)轉(zhuǎn)給鍵盤或 catch 語(yǔ)句的上一層模塊。輸入?yún)?shù) err 需為 MATLAB 結(jié)構(gòu)體,包含 message、identifier、stack 中至少一個(gè)域,這三個(gè)域的類型與 lasterror 返回結(jié)果相同。 rethrow 函數(shù)通常與 try-catch 語(yǔ)句一起使用。如: try 表達(dá)式 1 catch do_cleanup rethrow(lasterror) end,31.07.2020,第
31、51頁(yè),消息標(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頁(yè),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ò)
33、 error 函數(shù)指定,格式為: error(msg_id, errormsg) error(msg_id, formatted_errormsg, arg1, arg2, .) 其中的消息標(biāo)志符可以省略。如果 lasterror 函數(shù)不使用該信息,上面的語(yǔ)句可以簡(jiǎn)寫為: error(errormsg) 下面以兩個(gè)實(shí)例說(shuō)明消息標(biāo)志符與 lasterror 的使用。,31.07.2020,第53頁(yè),31.07.2020,第54頁(yè),警告處理,警告用于提示用戶在程序運(yùn)行中出現(xiàn)異常情況。與錯(cuò)誤不同的是,警告并不中斷程序的運(yùn)行,而是顯示警告內(nèi)容并繼續(xù)執(zhí)行。警告通過(guò)函數(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頁(yè),程序設(shè)計(jì)的輔助函數(shù),表達(dá)式與函數(shù)的評(píng)估 計(jì)時(shí)器函數(shù),31.07.2020,第56頁(yè),31.07.2020,第57頁(yè),計(jì)時(shí)器函數(shù),31.07.2020,第58頁(yè),調(diào)試程序
35、,直接調(diào)試法 利用調(diào)試工具 采用命令行調(diào)試程序 采用調(diào)試界面調(diào)試程序,31.07.2020,第59頁(yè),直接調(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è)重要的線索。因此,查看變量值為程序調(diào)試的重要線索,由于在函數(shù)調(diào)用時(shí)只返回最后的輸出參數(shù),而不返回中間變量,因此,可以選擇下面的方法查看程序運(yùn)行中的變量值。 (1)通過(guò)分析后,將可能出錯(cuò)的語(yǔ)句后面的分號(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頁(yè),采用命令行調(diào)試程序,31.07.2020,第61頁(yè),31.07.2020,第62頁(yè),文本編輯器中的 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頁(yè),Set/Clear Breakpoint,設(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)。,31.07.2020,第64頁(yè),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頁(yè),Enable/Disable Breakpoint,該選項(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)在命令窗口中輸入該變量的變量名,則顯示該變量的值。 本節(jié)介紹了程序調(diào)試的函
39、數(shù)和工具,在真正編寫程序時(shí),需要根據(jù)不同的情況靈活應(yīng)用這些功能,達(dá)到最高的調(diào)試效率。,31.07.2020,第66頁(yè),優(yōu)化程序,通過(guò) Profiler 進(jìn)行程序運(yùn)行分析 通過(guò) tic、toc 函數(shù)進(jìn)行程序運(yùn)行分析 程序優(yōu)化的常用方法,31.07.2020,第67頁(yè),通過(guò) Profiler 進(jìn)行程序運(yùn)行分析,Profiler 工具為 MATLAB 中的圖形用戶接口,用于分析程序運(yùn)行時(shí)各個(gè)部分所消耗的時(shí)間,輔助用戶進(jìn)行程序優(yōu)化。通過(guò) Profiler,用戶可以: 避免由于疏忽造成的非必要操作 替換運(yùn)算較慢的算法,選擇快速算法 通過(guò)存儲(chǔ)變量的方式避免重復(fù)計(jì)算 通過(guò) 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í)間最多的語(yǔ)句或調(diào)用最頻繁的語(yǔ)句。用戶可以保存第一次分析的結(jié)果,以便
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年店鋪權(quán)益轉(zhuǎn)接與策劃協(xié)議書樣本
- 2025年聯(lián)盟權(quán)益與義務(wù)綜合協(xié)議
- 2025年專利權(quán)爭(zhēng)議和解協(xié)議指導(dǎo)原則
- 2025年廈門雇傭合同樣本
- 2025年雅安貨運(yùn)從業(yè)資格證考試一共多少題
- 2025年保險(xiǎn)市場(chǎng)開(kāi)發(fā)合作框架協(xié)議
- 2025年住房抵押清償購(gòu)房協(xié)議參考文本
- 六年級(jí)口算題及答案
- 2025年臨時(shí)合作開(kāi)發(fā)協(xié)議規(guī)范
- 2025年貴陽(yáng)貨運(yùn)從業(yè)資格證試題庫(kù)和答案解析
- 廈門三固科技有限公司貨幣資金管理優(yōu)化設(shè)計(jì)
- 北京卷2025屆高考語(yǔ)文倒計(jì)時(shí)模擬卷含解析
- 2023學(xué)年廣東省深圳實(shí)驗(yàn)學(xué)校初中部九年級(jí)(下)開(kāi)學(xué)語(yǔ)文試卷
- 貫徹《法治思想學(xué)習(xí)綱要》一書專題課件
- (完整版)施工組織設(shè)計(jì)范本
- 二年級(jí)口算題大全1000道(打印版)
- 年終總結(jié)總經(jīng)理講話
- 2024年事業(yè)單位考試(綜合管理類A類)綜合應(yīng)用能力試題及解答參考
- 2024-2025學(xué)年北師大版數(shù)學(xué)八年級(jí)上冊(cè)期末綜合測(cè)試卷
- 培訓(xùn)機(jī)構(gòu)校區(qū)管理規(guī)劃
- DBJ41-T 246-2021 河南省超低能耗公共建筑節(jié)能設(shè)計(jì)標(biāo)準(zhǔn) 河南省工程建設(shè)標(biāo)準(zhǔn)(住建廳版)
評(píng)論
0/150
提交評(píng)論