程序設計教學內(nèi)容_第1頁
程序設計教學內(nèi)容_第2頁
程序設計教學內(nèi)容_第3頁
程序設計教學內(nèi)容_第4頁
程序設計教學內(nèi)容_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第6章MATLAB語言程序設計主要內(nèi)容M文本文件介紹函數(shù)流程控制函數(shù)變量函數(shù)類型函數(shù)操作MATLAB編程錯誤處理程序設計的輔助函數(shù)調(diào)試程序優(yōu)化程序1/20/20251第6章MATLAB語言程序設計MATLAB做為一種廣泛用于科學計算的工具軟件,不僅具有強大的數(shù)值計算、科學計算和繪圖功能外,還具有強大的程序設計功能。MATLAB提供了兩種源程序文件格式:命令文件和函數(shù)文件1/20/20252命令文件命令文件類似于DOS下的批處理文件,它的執(zhí)行方式很簡單,用戶只需在提示符下鍵入該命令文件的文件名,MATLAB就會自動執(zhí)行該命令文件的各條語句。命令文件能對MATLAB工作空間的數(shù)據(jù)進行處理,文件中所有語句的執(zhí)行結(jié)果也完全返回到工作空間中,命令文件格式適用于用戶做需要立即得到結(jié)果的小規(guī)模運算1/20/20253函數(shù)文件一個M文件通常包含五個部分,函數(shù)定義語句、H1幫助行、幫助文本、函數(shù)體或者腳本文件語句和注釋語句。H1行為緊隨函數(shù)定義語句后面的一行注釋語句。當用戶通過help命令查詢該函數(shù)的說明信息時H1行顯示為第一行,另外lookfor函數(shù)只檢索和顯示H1行。幫助文本為H1行后面連續(xù)的注釋行,當在命令窗口中通過help命令查詢該函數(shù)的說明信息時則在窗口中顯示這些內(nèi)容。函數(shù)體為M文件的主要部分,是函數(shù)的執(zhí)行代碼。除上面的H1行和幫助文本外,為了易于理解,可以在書寫代碼時添加注釋語句。這些注釋語句在編譯程序時會被忽略,因此不會影響編譯速度和程序運行速度,但是能夠增加程序的可讀性。1/20/20254編寫命令文件的步驟新建文件、保存文件和運行(幾種方法)例5.1,命名為exam5_1.m程序行為Y=[512;837;968;555;423]Bar(Y,’stack’);Gridon;Set(gca,’layer’,’top’);1/20/20256M函數(shù)文件介紹函數(shù)式M文件函數(shù)式M文件比腳本式M文件相對復雜一些,腳本文件不需要自帶參數(shù),也不一定返回結(jié)果,而函數(shù)文件一般要自帶參數(shù),并且有返回結(jié)果,以便于更好的把整個程序連為一段。函數(shù)文件也可以不帶參數(shù),此時文件中一般使用一些全局變量來實現(xiàn)與外界和其他函數(shù)之間的數(shù)據(jù)交換。函數(shù)文件的第一行以function開始,說明此文件是一個函數(shù)。其實質(zhì)為用戶向MATLAB函數(shù)庫中添加的子函數(shù)。在默認情況下,函數(shù)文件中的變量都是局部變量,僅在函數(shù)運行期間有效,函數(shù)運行結(jié)束后,這些變量將從工作區(qū)中清除。文件名的約定1/20/20257M函數(shù)文件編程實例一維向量求平均數(shù)functiony=average(x)%AVERAGEMeanofvectorelements.%AVERAGE(X),whereXisavector,isthemeanofvectorelements.%Nonvectorinputresultsinanerror.[m,n]=size(x);if(~((m==1)|(n==1))|(m==1&n==1))error('Inputmustbeavector')endy=sum(x)/length(x);%Actualcomputation1/20/20258函數(shù)流程控制順序結(jié)構(gòu)判斷語句(if…else…end)分支語句循環(huán)語句try…catch…end語句其他流程控制函數(shù)1/20/20259順序結(jié)構(gòu)順序結(jié)構(gòu)是最簡單的程序結(jié)構(gòu),系統(tǒng)在編譯程序時,按照程序的物理位置順序執(zhí)行。這種程序容易編制,但是結(jié)構(gòu)單一,能夠?qū)崿F(xiàn)的功能有限。例:不采用第3個變量,實現(xiàn)兩個數(shù)值的交換1/20/202510順序結(jié)構(gòu)舉例function[a,b]=exchange(a,b)%exchangethevalueoftwonumberswithoutthethirdvariabledisp('step1:a=a+b');a=a+bdisp('step2:b=a-b');b=a-bdisp('step3:a=a-b');a=a-bdisp('finalresult:');1/20/202511判斷語句(if…else…end)if…endif…else…endif…elseif…else…end1/20/202512判斷語句if…end此時的程序結(jié)構(gòu)如下:if表達式執(zhí)行代碼塊end這是最簡單的判斷語句,只有一個判斷語句,其中的表達式為邏輯表達式,當表達式為真時,執(zhí)行相應的語句,否則,直接跳到下一段語句。1/20/202513判斷語句if…else…end當程序有兩個選擇時,可以選擇if…else…end結(jié)構(gòu),此時程序結(jié)構(gòu)為:if表達式執(zhí)行代碼塊1else執(zhí)行代碼塊2end當判斷表達式為真時,執(zhí)行代碼塊1,否則執(zhí)行代碼塊2。1/20/202514判斷語句if…elseif…else…end上面的兩種形式中,分別包含一個選擇和兩個選擇,當判斷包含多個選擇時,可以采用elseif語句,結(jié)構(gòu)為:if表達式1執(zhí)行代碼塊1elseif表達式2執(zhí)行代碼塊2elseif..................else執(zhí)行代碼塊end其中可以包含任意多個elseif語句。1/20/202515條件語句實例判斷兩個輸入的參數(shù)是否都大于零,是則返回‘a(chǎn)andbbothlargertan0’不全大于零則返回‘a(chǎn)andbnotbothlargertan0’1/20/202516分支語句上一節(jié)中的if…elseif…else…end語句可以適用于多種選擇的流程控制,此時對else之外的每一個選擇語句設置一個表達式,表達式為真時則執(zhí)行該模塊。MATLAB中的另一種多選擇語句為分支語句。分支語句的結(jié)構(gòu)為:switch分支語句case條件語句執(zhí)行代碼塊case{條件語句1,條件語句2,條件語句3,...}執(zhí)行代碼塊otherwise執(zhí)行代碼塊end1/20/202517分支語句其中的分支語句為一個變量,可以是數(shù)值變量或者字符串變量,如果該變量的值與某一條件相符,則執(zhí)行相應的語句,否則,執(zhí)行otherwise后面的語句。在每一個條件中,可以包含一個條件語句,可以包含多個條件,當包含多個條件時,將條件以單元數(shù)組的形式表示。MATLAB的分支語句類似于C語言的分支語句,但是又不完全相同:MATLAB語句從上到下依次判斷條件,條件符合則執(zhí)行相應的代碼塊,之后退出該分支語句,因此在代碼塊后面不需要添加“break”語句。1/20/202518循環(huán)語句在科學計算及生活實際中,會遇到許多有規(guī)律的重復運算。如果一個計算過程,要重復一系列的計算步驟若干次,每次計算步驟完全相同,則這種算法過程稱為循環(huán)過程。MATLAB中有兩種循環(huán),一種是指定循環(huán)次數(shù),另一種是每次需判定循環(huán)條件。for語句while語句1/20/2025191.for語句for語句將相同的代碼執(zhí)行預定義的次數(shù)。for語句的結(jié)構(gòu)為:for循環(huán)變量=表達式執(zhí)行代碼塊end生活中應用for循環(huán)的例子很多。求自然數(shù)前n項和用二分法解方程比較應用命令文件函數(shù)文件的區(qū)別(命令文件exam5_6,函數(shù)文件fangch)1/20/2025202.while語句while語句用于將相同的代碼塊執(zhí)行多次,但是次數(shù)并不預先指定,當while的條件表達式為真時,執(zhí)行代碼塊,直到條件表達式為假。while語句的結(jié)構(gòu)為:while表達式執(zhí)行代碼塊end1/20/202521While編程實例求前n項和,使和小于等于100的n值1/20/202522try…catch…end語句MATLAB中的另一種判斷語句為try…catch語句,這種語句可以包容程序運行中的錯誤,并返回錯誤類型。這種語句的結(jié)構(gòu)為:try運行代碼塊catch運行代碼塊end該語句首先從上到下依次執(zhí)行,如果遇到程序錯誤則運行下一個catch中的語句,依次向下進行。如果程序運行成功,則退出該判斷語句。如果在catch和end之間的程序運行出錯,則程序運行終止,或者如果存在其他的try…catch結(jié)構(gòu),則運行下一個try…catch結(jié)構(gòu)??梢岳胠asterr命令查看發(fā)生錯誤的原因。1/20/202523try…catch…end語句exam5_7%trycatchclearN=4;A=magic(3);tryA_N=A(N,:);catchA_end=A(end,:)%如果程序出錯則執(zhí)行此行endlasterr%顯示出錯原因1/20/202524其他流程控制函數(shù)continue:continue語句通常用在循環(huán)控制中,包括for循環(huán)和while循環(huán),用于結(jié)束當次循環(huán),繼續(xù)執(zhí)行下一次循環(huán),但是不結(jié)束當前循環(huán)。一般continue語句與if語句相結(jié)合,當滿足一定的條件時,執(zhí)行continue語句。break:與continue相同的是,break函數(shù)也是用于循環(huán)控制,中斷當前循環(huán)。與continue不同,break跳出當前循環(huán),不再執(zhí)行該循環(huán)的任何操作。return:結(jié)束該程序的執(zhí)行,返回到調(diào)用函數(shù)或者鍵盤。1/20/202525算法的概念算法可以理解為由基本運算及規(guī)定的運算順序所構(gòu)成的完整的解題步驟,或者看成按照要求設計好有限的確切的計算序列,并且這樣的步驟或序列能夠解決一類問題描述算法可以有不同的方式,例如,可以用自然語言和數(shù)學語言加以描述,也可以借助形式語言(算法語言)給出精確的說明,也可以用框圖直觀地顯示算法的全貌1/20/202526設計實例寫出一個求有限整數(shù)序列中最大值的算法用自然語言敘述先假定序列中第一個數(shù)為“最大值”將序列中下一個數(shù)與最大值比較,得出另一個“最大值”重復步驟2這樣的比較做到最后,最后得出的最大值即為有限整數(shù)序列中最大值1/20/202527設計實例用數(shù)學語言,寫出對任意3個數(shù)a,b和c求出最大值的算法Max=a如果b>a,則max=b如果c>max則max=cMax就是3個數(shù)中的最大值1/20/202528設計實例用matlab程序?qū)崿F(xiàn)a=input('a=')b=input('b=')c=input('c=')max=a;ifb>maxmax=bendifc>maxmax=cendmax1/20/202529選擇結(jié)構(gòu)實例求解一元二次方程用數(shù)學語言來描述其算法計算:判斷則原方程無實數(shù)解否則輸出解x1,x21/20/202530用Matlab程序?qū)崿F(xiàn)a=input('a=')b=input('b=')c=input('c=')dt=b^2-4*a*c;ifdt<0disp('error')elsex1=(-b+sqrt(dt))/2*a;x2=(-b-sqrt(dt))/2*a;end1/20/202531函數(shù)變量變量類型MATLAB將每個變量保存在一塊內(nèi)存空間中,這個空間稱為工作區(qū)(workspace)主工作區(qū)包括所有通過命令窗口創(chuàng)建的變量和腳本文件運行生成的變量,腳本文件沒有獨立的工作區(qū),而每個函數(shù)都有獨立的工作區(qū),將該函數(shù)的所有的變量保存在該工作區(qū)中。局部變量全局變量永久變量1/20/202532局部變量每個函數(shù)都有自己的局部變量,這些變量存儲在該函數(shù)獨立的工作區(qū)中,與其他函數(shù)的變量及主工作區(qū)中的變量分開存儲。當函數(shù)調(diào)用結(jié)束時,這些變量隨之刪除,不保存在內(nèi)存中。并且,除了函數(shù)返回值,該函數(shù)不改變工作區(qū)中其他變量的值。然而腳本文件沒有獨立的工作區(qū),當通過命令窗口調(diào)用腳本文件時,腳本文件分享主工作區(qū),當函數(shù)調(diào)用腳本文件時,腳本文件分享主調(diào)函數(shù)的工作區(qū)。需要注意的是,如果腳本中改變了工作區(qū)中變量的值,則在腳本文件調(diào)用結(jié)束后,該變量的值發(fā)生改變。在函數(shù)中,變量默認為局部變量。1/20/202533全局變量局部變量只在一個工作區(qū)內(nèi)有效,無論是函數(shù)工作區(qū)還是MATLAB主工作區(qū)。與局部變量不同,全局變量可以在定義該變量的全部工作區(qū)中有效。當在一個工作區(qū)內(nèi)改變該變量的值時,該變量在其他工作區(qū)中的變量同時改變。任何函數(shù)如果需要使用全局變量,則必須首先聲明,聲明格式為:global變量名1變量名2如果一個M文件中包含的子函數(shù)需要訪問全局變量,則需在子函數(shù)中聲明該變量,如果需要在命令行中訪問該變量,則需在命令行中聲明該變量。1/20/202534永久變量除局部變量和全局變量外,MATLAB中還有一種變量類型為永久變量。永久變量的特點為:只能在M文件內(nèi)部定義;只有該變量從屬的函數(shù)能夠訪問該變量;當函數(shù)運行結(jié)束時,該變量的值保留在內(nèi)存中,因此當該函數(shù)再次被調(diào)用時,可以再次利用這些變量。永久變量的定義方法為:persistent變量名1變量名2。1/20/202535腳本文件和函數(shù)文件的區(qū)別1、變量類型不同2、參數(shù)的傳遞3、執(zhí)行(調(diào)用)方式不同1/20/2025366.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ù)1/20/202537匿名函數(shù)匿名函數(shù)提供了一種創(chuàng)建簡單程序的方法,使用它用戶可以不必每次都編寫M文件。用戶可以在MATLAB的命令窗口或是其他任意M文件和腳本文件中使用匿名函數(shù)。匿名函數(shù)的格式為:fhandle=@(arglist)expr其中fhandle是為該函數(shù)創(chuàng)建的函數(shù)句柄;@符號用于創(chuàng)建函數(shù)句柄;arglist為用逗號分隔的參數(shù)列表;expr為函數(shù)主體,為MATLAB表達式。1/20/202538匿名函數(shù)示例無參數(shù)調(diào)用方法命令窗口下輸入t=@()datestr(now)t()命令窗口顯示當前的日期和時間有參數(shù)調(diào)用方法命令窗口下輸入

h_sin=@(x,y)(sin(x+y))h_sin(pi/3,pi/pi/6)1/20/202539主函數(shù)通常每個函數(shù)文件中的第一個函數(shù)為主函數(shù),主函數(shù)可以被該文件之外的其他函數(shù)調(diào)用,而子函數(shù)只能被該文件內(nèi)的函數(shù)調(diào)用。主函數(shù)的調(diào)用通過存儲該函數(shù)的M文件的文件名調(diào)用。1/20/202540子函數(shù)一個M文件中可以包括多個函數(shù),除主函數(shù)之外的其他函數(shù)稱為子函數(shù)。子函數(shù)只能被主函數(shù)或該文件內(nèi)的其他子函數(shù)調(diào)用。每個子函數(shù)以函數(shù)定義語句開頭,直至下一個函數(shù)的定義或文件的結(jié)尾。當函數(shù)中調(diào)用函數(shù)時,系統(tǒng)判斷其函數(shù)類型的順序為:首先判斷是否為子函數(shù),然后判斷是否為私有函數(shù),最后判斷其是否為當前目錄下的M文件函數(shù)或者系統(tǒng)內(nèi)置函數(shù)。由于子函數(shù)具有最高的優(yōu)先級別,因此,在定義子函數(shù)時,可以采用已有的其他外部函數(shù)的名稱。1/20/202541嵌套函數(shù)一個函數(shù)內(nèi)部可以定義其他的函數(shù),這種內(nèi)部的函數(shù)稱作嵌套函數(shù)。1.嵌套函數(shù)的書寫定義嵌套函數(shù)時,只要在一個函數(shù)內(nèi)部直接定義嵌套函數(shù)即可。需要注意的是當一個M文件中存在嵌套函數(shù)時,該文件內(nèi)的所有函數(shù)必須以end結(jié)尾。1/20/202542例嵌套函數(shù)的結(jié)構(gòu)functionx=A(p1,p2)...functiony=B(p3)...end...end1/20/202543每個函數(shù)中可以嵌套多個函數(shù)。例多個平行嵌套函數(shù)functionx=A(p1,p2)...functiony=B(p3)...endfunctionz=C(p4)...end...End在這個程序中,函數(shù)A嵌套了函數(shù)B和函數(shù)C。1/20/202544另外,嵌套函數(shù)還可以包含嵌套函數(shù),結(jié)構(gòu)如下。functionx=A(p1,p2)...functiony=B(p3)...functionz=C(p4)...end...end...end在這段程序中,函數(shù)A嵌套了函數(shù)B,函數(shù)B嵌套了函數(shù)C。1/20/2025452.嵌套函數(shù)的調(diào)用一個嵌套函數(shù)可以被下列函數(shù)調(diào)用:(1)該嵌套函數(shù)的上一層函數(shù),如上面例中函數(shù)A可以調(diào)用函數(shù)B,函數(shù)B可以調(diào)用函數(shù)C,但是函數(shù)A不能調(diào)用函數(shù)C;(2)同一函數(shù)下的同級嵌套函數(shù)(3)被任一低級別的函數(shù)調(diào)用。1/20/202546私有函數(shù)私有函數(shù)是MATLAB中的另一類函數(shù),這類函數(shù)位于名為“private”的子文件夾中,只能被上一級文件夾中的函數(shù)或者這些函數(shù)所調(diào)用的M文件調(diào)用。如,當前文件夾為matlabmath,matlabmath中包含子文件夾private,則private中的函數(shù)只能被matlabmath根目錄下的函數(shù)及這些函數(shù)調(diào)用的M文件調(diào)用。私有函數(shù)只能被其父文件夾中的函數(shù)調(diào)用,因此,用戶可以開發(fā)自己的函數(shù)庫,函數(shù)的名稱可以與系統(tǒng)標準M函數(shù)庫名稱相同,而不必擔心在函數(shù)調(diào)用時發(fā)生沖突,因為MATLAB首先查找私有函數(shù),再查找標準函數(shù)。1/20/202547重載函數(shù)函數(shù)重載為程序編寫和用戶調(diào)用都提供了很大的方便。函數(shù)重載允許多個函數(shù)使用相同的函數(shù)名,不同的輸入?yún)?shù)類型。在函數(shù)調(diào)用時,系統(tǒng)根據(jù)輸入?yún)?shù)的情況自動選擇相應的函數(shù)執(zhí)行。1/20/202548函數(shù)參數(shù)當調(diào)用函數(shù)時,主調(diào)函數(shù)通過函數(shù)參數(shù)的形式向被調(diào)函數(shù)傳遞數(shù)據(jù),被調(diào)函數(shù)通過函數(shù)返回值的形式向主調(diào)函數(shù)返回數(shù)據(jù)。本節(jié)介紹函數(shù)參數(shù),內(nèi)容包括:輸入?yún)?shù)數(shù)目確定、輸入可變數(shù)目的參數(shù)、向嵌套函數(shù)輸入可選參數(shù)和修改參數(shù)值并返回。1/20/2025491.函數(shù)參數(shù)數(shù)目確定函數(shù)nargin和函數(shù)nargout分別用于確定函數(shù)的輸入輸出參數(shù)個數(shù)。在函數(shù)體內(nèi)部用nargin(nargout)確定輸入輸出參數(shù)后可以用條件語句確定需要執(zhí)行的操作。1/20/202550參見函數(shù)myplot這個函數(shù)中可以接受2~5個輸入?yún)?shù),通過nargin確定輸入?yún)?shù)的個數(shù),如果輸入?yún)?shù)為0則繪制圖形,否則輸出x0,y0的值。1/20/202551function[x0,y0]=myplot(x,y,npts,angle,subdiv)%MYPLOTPlotafunction.%MYPLOT(x,y,npts,angle,subdiv)%Thefirsttwoinputargumentsare%required;theotherthreehavedefaultvalues....ifnargin<5,subdiv=20;endifnargin<4,angle=10;endifnargin<3,npts=25;end...ifnargout==0plot(x,y)elsex0=x;y0=y;end1/20/202552函數(shù)參數(shù)2.參數(shù)數(shù)目可變的函數(shù)函數(shù)nargin和函數(shù)nargout允許函數(shù)接收或返回任意數(shù)目的參數(shù)。在MATLAB中,輸入輸出參數(shù)是以單元數(shù)組的形式進行傳輸?shù)模狠斎雲(yún)?shù)以單元數(shù)組的形式傳遞給函數(shù),單元數(shù)組的每個元素為相應的參數(shù),同樣,輸出參數(shù)也是以單元數(shù)組的形式組織的。如此的參數(shù)組織形式便于函數(shù)接受任意數(shù)目的參數(shù)。見下面的例子。1/20/202553functionplotvar(varargin)lineflag=0;subk=0;fork=1:length(varargin)ifischar(varargin{k})lineflag=k;elsesubk=subk+1;x(subk)=varargin{k}(1);%Cellarrayindexingy(subk)=varargin{k}(2);endendxmin=min(0,min(x));ymin=min(0,min(y));axis([xminfix(max(x))+3yminfix(max(y))+3])iflineflag~=0plot(x,y,varargin{lineflag});elseplot(x,y);end1/20/202554函數(shù)plotvar繪制任意數(shù)目的點的圖像在命令窗口中調(diào)用該函數(shù)figure,subplot(1,2,1),plotvar([23],[15],[48],[65],[42],[23]);subplot(1,2,2),plotvar([23],[15],[48],[65],[42],[23],'*');1/20/202555在調(diào)用該函數(shù)時可以輸入任意數(shù)目的參數(shù),參數(shù)可以為二元數(shù)組或者表示線型的字符串,該函數(shù)將用指定的線型繪制輸入數(shù)據(jù)的圖像。指定線型的字符串可以在任意位置輸入,并且可以輸入多個,但是需要注意的是。在上面的程序中,將所有輸入?yún)?shù)作為一個單元數(shù)組,利用花括號和圓括號對數(shù)組元素進行訪問,實現(xiàn)輸入?yún)?shù)的調(diào)用。1/20/202556在嵌套函數(shù)中也可以使用可變參數(shù)需要注意的是,varargin、varargout、nargin和nargout的意義可能有所不同。下面介紹這四個元素的應用規(guī)則。varargin和varargout這兩個元素為變量,與MATLAB其他變量的作用范圍相同。由于嵌套函數(shù)與主函數(shù)使用相同的工作區(qū),因此varargin和varargout既可以表示嵌套函數(shù)的輸入輸出參數(shù),也可以是主函數(shù)的輸入輸出函數(shù),具體值取決于程序中的變量聲明:如果嵌套函數(shù)在函數(shù)聲明中包含varargin或者varargout,則在該函數(shù)內(nèi)部調(diào)用這兩個變量時,變量內(nèi)容為該函數(shù)的輸入輸出參數(shù);如果嵌套函數(shù)聲明中沒有包含varargin或者varargout,而在該函數(shù)的上層函數(shù)聲明中包含varargin或者varargout,則當在該嵌套函數(shù)內(nèi)部調(diào)用這兩個變量時,變量內(nèi)容為上層函數(shù)的輸入輸出參數(shù)。1/20/202557nargin和nargoutnargin和nargout是函數(shù),當在函數(shù)中調(diào)用這兩個函數(shù)時,其值為該函數(shù)的輸入或輸出參數(shù),而不需要進行聲明。1/20/202558MATLAB編程錯誤處理通過try-catch語句檢測錯誤對錯誤進行處理并且從錯誤中恢復消息標志符警告處理1/20/202559通過try-catch語句檢測錯誤無論程序的編寫多么謹慎,在不同的環(huán)境下運行時都有可能產(chǎn)生意外的錯誤。因此,有必要在程序中添加錯誤檢測語句,保證程序在所有的條件下都能夠正常運行。MATLAB中的try-catch語句可用于錯誤檢測。如果程序中的一些語句可能會產(chǎn)生非預計的結(jié)果,可以將這些語句放在try-catch塊中。try-catch語句可以檢測所有錯誤,并且分別進行處理。格式如下:try表達式1catch表達式2end1/20/202560通過try-catch語句檢測錯誤在try-catch語句中,可以嵌套其他的try-catch語句,其格式為:try表達式1%執(zhí)行表達式1catchtry表達式2%嘗試從錯誤中恢復catchdisp'Operationfailed'%處理錯誤endend1/20/202561例編寫一個簡單的程序,進行矩陣乘法,當錯誤發(fā)生時,在命令窗口顯示錯誤提示參見matrixMultiplyfunctionmatrixMultiply(A,B)tryX=A*Bcatchdisp'**ErrormultiplyingA*B'end1/20/202562在命令窗口輸入A=magic(3);B=fix(rand(3,4)*10)matrixMultiply(B,A)1/20/202563對錯誤進行處理并且從錯誤中恢復1.發(fā)出錯誤報告MATALB中error函數(shù)可以報告錯誤并且中斷程序運行。用戶可以通過指定error函數(shù)參數(shù)的方式指定將要發(fā)出的錯誤信息。1/20/202564對錯誤進行處理并且從錯誤中恢復2.識別錯誤發(fā)生的原因當錯誤發(fā)生時,用戶需要知道錯誤發(fā)生的位置及錯誤原因,以便能夠正確處理錯誤。lasterror函數(shù)可以返回最后發(fā)生的錯誤的相關信息,輔助用戶識別錯誤。lasterror返回結(jié)果為一個結(jié)構(gòu)體,該結(jié)構(gòu)體包含三個域,分別為message、identifier、stack。message為字符串,其內(nèi)容為最近發(fā)生的錯誤的相關文本信息;identifier也是一個字符串,內(nèi)容為錯誤消息的類別標志;stack為一結(jié)構(gòu)體,其內(nèi)容為該錯誤的堆棧中的相關信息。stack包含三個域,為file、name和line,分別為文件名、函數(shù)名和錯誤發(fā)生的行數(shù)。1/20/202565通過try-catch語句檢測錯誤3.錯誤重現(xiàn)在一些情況下,需要重現(xiàn)已經(jīng)拋出過的錯誤,以便于對錯誤進行分析。MATLAB中函數(shù)rethrow可以重新拋出指定的錯誤。該函數(shù)的格式為rethrow(err),其中輸入?yún)?shù)err用于指定需要重現(xiàn)的錯誤。該語句執(zhí)行后程序運行中斷,將控制權轉(zhuǎn)給鍵盤或catch語句的上一層模塊。輸入?yún)?shù)err需為MATLAB結(jié)構(gòu)體,包含message、identifier、stack中至少一個域,這三個域的類型與lasterror返回結(jié)果相同。rethrow函數(shù)通常與try-catch語句一起使用。如:try表達式1catchdo_cleanuprethrow(lasterror)end1/20/202566消息標志符1.消息標志符的格式標志符為一個字符串,指定錯誤或警告消息的類別(component)及詳細信息(mnemonic)。通常為“類別:詳細信息”的格式。如:MATLAB:divideByZeroSimulink:actionNotTakenTechCorp:notFoundInPath等。類別部分指定錯誤或警告可能發(fā)生的大體位置,通常為某一產(chǎn)品的名字或者工具箱的名字,如MATLAB或者Control。MATLAB支持使用多層次的類別名稱。詳細信息用于指定消息的具體內(nèi)容,如除數(shù)為0等。如下面的例子為一個完整的標志符:error('MATLAB:ambiguousSyntax','Syntax%scouldbeambiguous.\n',inputstr)。

1/20/202567消息標志符1.消息標志符的格式標志符為一個字符串,指定錯誤或警告消息的類別及詳細信息通常為“類別:詳細信息”的格式。如:MATLAB:divideByZeroSimulink:actionNotTakenTechCorp:notFoundInPath等。類別部分指定錯誤或警告可能發(fā)生的大體位置,通常為某一產(chǎn)品的名字或者工具箱的名字,如MATLAB或者Control。MATLAB支持使用多層次的類別名稱。詳細信息用于指定消息的具體內(nèi)容,如除數(shù)為0等。如下面的例子為一個完整的標志符:error('MATLAB:ambiguousSyntax','Syntax%scouldbeambiguous.\n',inputstr)。

1/20/202568消息標志符2.標志符的應用消息標志符通常與lasterror函數(shù)一起應用,使得lasterror函數(shù)和lasterr函數(shù)能夠識別錯誤的原因。lasterror函數(shù)和lasterr函數(shù)返回消息標志符,用戶可以通過其類別信息和詳細信息分別獲取錯誤的總體類別及具體信息。使用消息標志符的第一步為確定目的信息并為其指定標志符。消息標志符通過error函數(shù)指定,格式為:error('msg_id','errormsg')error('msg_id','formatted_errormsg',arg1,arg2,...)其中的消息標志符可以省略。如果lasterror函數(shù)不使用該信息,上面的語句可以簡寫為:error('errormsg')1/20/202569錯誤處理的常用函數(shù)函數(shù)功能catch指定對try部分發(fā)生的錯誤做出如何的操作error顯示錯誤消息并停止程序運行ferror獲取文件輸入輸出中的錯誤信息intwarning返回整數(shù)警告的控制狀態(tài)lasterror上一個錯誤的信息rethrow重新拋出上一個錯誤try試圖運行一個代碼塊,并捕捉錯誤warning警告信息1/20/202570警告處理警告用于提示用戶在程序運行中出現(xiàn)異常情況。與錯誤不同的是,警告并不中斷程序的運行,而是顯示警告內(nèi)容并繼續(xù)執(zhí)行。警告通過函數(shù)warning發(fā)出,格式與error函數(shù)相同,如:warning('Inputmustbeastring')warning('formatted_warningmsg',arg1,arg2,...)warning('Ambiguousparametername,"%s".',param)另外,與錯誤相同,警告也可以使用消息標志符,用以顯示該警告信息的類別及具體信息。警告處理的方式與錯誤處理的方式類似這里不再贅述。1/20/202571程序設計的輔助函數(shù)表達式與函數(shù)的評估計時器函數(shù)1/20/202572表達式與函數(shù)的評估函數(shù)功能函數(shù)功能arrayfun對數(shù)組的每個元素應用函數(shù)iskeyword判斷輸入字符串是否為MATLAB關鍵字builtin以重載方式執(zhí)行嵌套函數(shù)isvarname判斷輸入字符串是否為MATLAB有效變量名cellfun對單元數(shù)組的每個單元應用函數(shù)pause暫停,等待用戶反應echo在執(zhí)行中顯示當前運行行run運行非當前路徑下的腳本eval執(zhí)行包含MATLAB表達式的字符串script腳本文件描述evalc評估MATLAB表達式structfun對結(jié)構(gòu)體的每個域運行函數(shù)evalin在指定工作區(qū)中運行表達式symvar判斷表達式中的符號變量feval函數(shù)評估tic,toc采用計數(shù)器評估函數(shù)的運行1/20/202573arrayfun函數(shù)應用首先創(chuàng)建一個1×15的結(jié)構(gòu)體數(shù)組,每個元素包含兩個域,f1和f2,每個域為大小不同的數(shù)組,同一個元素的兩個域不相同。見exam6_271/20/202574計時器函數(shù)函數(shù)功能delete刪除內(nèi)存中的計時器對象disp顯示計時器對象的相關信息get獲取計時器對象的屬性isvalid判斷計時器對象是否有效set設置或顯示計時器對象的屬性start開啟計時器startat在指定時間啟動計時器stop關閉計時器timer生成計時器對象timerfind查找計時器對象timerfindall查找計時器對象,包括不可見對象wait等待,直至計時器停止1/20/202575計時器操作實例首先創(chuàng)建三個計時器T1=timer;T2=timer;T3=timer;設置t2的objectvisibility屬性為off通過timefind函數(shù)查看當前工作區(qū)中的計時器對象通過timefindall可查看全部1/20/202576調(diào)試程序錯誤包括語法錯誤和邏輯錯誤,語法錯誤可以由編譯器檢測,邏輯錯誤是算法本身的問題,或者指令使用不當造成的運行結(jié)果錯誤,一般發(fā)生在運行過程中,影響因素較多,調(diào)試較為困難。直接調(diào)試法利用調(diào)試工具采用命令行調(diào)試程序采用調(diào)試界面調(diào)試程序1/20/202577直接調(diào)試法MATLAB語言具有強大的運算能力,指令系統(tǒng)簡單,因此程序通常非常簡潔。對于簡單的程序可以采用直接調(diào)試的方法。在程序調(diào)試時,程序運行中變量的值為一個重要的線索。因此,查看變量值為程序調(diào)試的重要線索,由于在函數(shù)調(diào)用時只返回最后的輸出參數(shù),而不返回中間變量,因此,可以選擇下面的方法查看程序運行中的變量值。(1)將可能出錯的語句后面的分號(;)刪除,將結(jié)果顯示在命令窗口中,與預期值進行比較;(2)利用函數(shù)disp顯示中間變量的值;(3)在程序中的適當位置添加keyboard指令。當MATLAB執(zhí)行至此處時將暫停,等待用戶反應。在命令窗口提示符下,用戶可以查看工作區(qū)中的變量,輸入return指令返回程序,繼續(xù)運行。(4)在調(diào)試一個單獨的函數(shù)時,可以將函數(shù)改寫為腳本文件,此時可以直接對輸入?yún)?shù)賦值,然后以腳本方式運行該M文件,這樣可以保存中間變量,在運行完成后,可以查看中間變量的值,對結(jié)果進行分析,查找錯誤所在。1/20/202578利用調(diào)試工具采用命令行調(diào)試程序;采用調(diào)試界面調(diào)試程序1/20/202579采用命令行調(diào)試程序函數(shù)功能dbstop設置斷點dbclear刪除斷點dbcont重新開始dbdown恢復由dbup修改的變量值dbmex啟動MEX文件調(diào)試dbstack列出調(diào)用關系dbstatus列出所有的斷點dbstep執(zhí)行一行或多行dbtype列出M文件并標出每行dbup修改工作區(qū)中變量的值dbquit退出調(diào)試模式1/20/202580命令行調(diào)試程序常用函數(shù)函數(shù)功能echo顯示執(zhí)行的腳本或函數(shù)代碼disp顯示指定變量的值或者其他信息sprintf,fprintf格式化輸出不同類型的變量whos查看工作區(qū)中的變量size顯示數(shù)組維數(shù)keyboard中斷程序執(zhí)行,將控制權交給鍵盤,允許鍵盤輸入return在keyboard中斷后繼續(xù)返回程序執(zhí)行warning顯示指定的警告消息error顯示指定的錯誤消息lasterr返回最后一條錯誤消息lasterror返回最后一條錯誤消息及相關信息lastwarn返回最后一條警告消息1/20/202581調(diào)試器界面(Debug)常用菜單文本編輯器中的Debug菜單提供了全部的調(diào)試選項,另外,MATLAB主窗口中的Debug菜單提供了一些調(diào)試命令,方便調(diào)試時在命令窗口中查看運行狀態(tài)。調(diào)試選項及其功能如表所示。選項功能對應快捷鍵OpenM-fileswhenDebbuging選擇該選項則在調(diào)試打開M文件無Step下一步F10StepIn進入被調(diào)用函數(shù)內(nèi)部F11StepOut跳出當前函數(shù)Shift+F11Continue執(zhí)行,直至下一斷點F5GountilCursor執(zhí)行至當前光標處無Set/ClearBreakpoint設置或刪除斷點F12Set/ModifyConditionalBreakpoint…設置或修改條件斷點無Enable/DisableBreakpoint開啟或關閉光標行的斷點無ClearBreakpointsinAllFiles刪除所有文件中的斷點無StopifErrors/Warings遇到錯誤或者警告時停止無1/20/202582調(diào)試器常用菜單Set/ClearBreakpoint,設置或清除斷點??梢赃x擇該選項對當前行進行操作,或者通過快捷鍵F12,或者直接點擊該行左側(cè)的“-”,如圖所示。設置斷點時該處顯示為紅點。再次進行相同的操作則刪除該斷點。1/20/202583調(diào)試器常用菜單Set/ModifyConditionalBreakpoint…,該選項用于設置或修改條件斷點。條件斷點為一種特殊的斷點,當滿足指定的條件時則程序執(zhí)行至此時停止,條件不滿足時則程序繼續(xù)進行。其設置界面如圖所示,在輸入框中輸入斷點條件則將當前行設置為條件斷點。1/20/202584調(diào)試器常用菜單Enable/DisableBreakpoint,該選項用于開啟或關閉當前行的斷點,如果當前行不存在斷點,則設置當前行為斷點;如果當前行是斷點,則改變該斷點的狀態(tài)。在調(diào)試時,被關閉的斷點將會被忽略。在程序調(diào)試中,變量的值是查找錯誤的重要線索,在MATLAB中查看變量的值可以有三種方法:(1)在編輯器中將鼠標放置在待查看的變量處,停留,則在此處顯示該變量的值;(2)在工作區(qū)瀏覽器中查看該變量的值;(3)在命令窗口中輸入該變量的變量名,則顯示該變量的值。在編寫程序時,需要根據(jù)不同的情況靈活應用這些功能,達到最高的調(diào)試效率。1/20/202585結(jié)束1/20/202586優(yōu)化程序若要加快程序的運行,第一步應該是找到程序的瓶頸所在,即程序中所需運行時間最長的部分,這一部分為優(yōu)化的重點部位。MATLAB提供兩種方法程序優(yōu)化的常用方法通過Profiler進行程序運行分析通過tic、toc函數(shù)進行程序運行分析1/20/202587通過Profiler進行程序運行分析Profiler工具為MATLAB中的圖形用戶接口,用于分析程序運行時各個部分所消耗的時間,輔助用戶進行程序優(yōu)化。通過Profiler,用戶可以:避免由于疏忽造成的非必要操作替換運算較慢的算法,選擇快速算法通過存儲變量的方式避免重復計算通過Profiler工具進行程序運行分析通常按照下面的步驟進行:(1)查看Profi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論