《MATLAB基礎與編程入門》課件-第4章 MATLAB編程基礎_第1頁
《MATLAB基礎與編程入門》課件-第4章 MATLAB編程基礎_第2頁
《MATLAB基礎與編程入門》課件-第4章 MATLAB編程基礎_第3頁
《MATLAB基礎與編程入門》課件-第4章 MATLAB編程基礎_第4頁
《MATLAB基礎與編程入門》課件-第4章 MATLAB編程基礎_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

4.1M語言編輯器4.2腳本文件4.3流程控制4.4函數文件4.5M文件調試4.1M語言編輯器M編程語言是一種解釋型語言,利用該語言編寫的代碼僅能被MATLAB接受,被MATLAB解釋執(zhí)行。一個M語言文件是由若干MATLAB的命令組合在一起構成的純文本文件,這種文件具有.m擴展名。在M語言文件中包含的命令都是合法、正確的MATLAB命令,可以執(zhí)行創(chuàng)建數據對象、數據的運算與處理、調用函數等不同的操作。使用M語言文件的最直接好處是可以將一系列MATLAB命令組合起來構成命令文件,然后通過一個簡單的命令就可以調用這些命令。用戶可以自定義M文件完成某些MATLAB的操作,也可以實現某個具體的數據處理算法。MATLAB產品族中所包含的各種專業(yè)工具箱就是由相應專業(yè)領域內的頂尖高手利用M語言開發(fā)的算法函數文件集合。讀者也可以結合自己工作的需要,為自己的MATLAB開發(fā)滿足自身要求和使用習慣的算法工具箱。MATLAB的函數主要有兩類:一類被稱為內建(Build-in)的函數,這類函數是由MATLAB的內核提供的,能夠完成基本的運算,如三角函數、矩陣運算的函數等;另一類函數就是利用高級語言開發(fā)的函數文件,這里的函數文件包括用C/FORTRAN等高級編程語言開發(fā)的MEX函數文件,也包含用M語言開發(fā)的函數文件。MATLAB的M語言文件是純文本格式的文件,利用任何一種純文本編輯器都可以編寫相應的文件。為了方便用戶編輯M文件進行算法的開發(fā)和調試,MATLAB也提供了一個編輯器,叫作meditor,它也是系統(tǒng)默認的M語言文件編輯器。運行meditor的方法非常簡單,在MATLAB命令行窗體中鍵入下面的命令就可以打開meditor:>>edit這時MATLAB將啟動meditor,然后創(chuàng)建一個未命名的空白文件,如圖4-1所示。這時用戶就可以直接在編輯器中鍵入MATLAB命令,開發(fā)M語言文件了。4.2腳本文件腳本文件,就是由一系列MATLAB命令羅列在一起組成的M語言文件。腳本文件沒有輸入參數,也沒有輸出參數,執(zhí)行起來就像操作系統(tǒng)的批處理文件一樣,文件中的命令按照出現在腳本文件中的順序依次執(zhí)行。腳本文件能夠處理的數據或者變量需要出現在MATLAB基本工作空間中,而計算的結果也會輸出到MATLAB的基本工作空間內?!纠?-1】腳本文件示例—script_example.m。001 %例4-1script_example.m002 %{003 注釋行004 M腳本文件示例005 "flowerpetal"006 以下為代碼行007 計算008 %}009 theta=-pi:0.01:pi;010 rho(1,:)=2*sin(5*theta).^2;011 rho(2,:)=cos(10*theta).^3;012 rho(3,:)=sin(theta).^2;013 rho(4,:)=5*cos(3.5*theta).^3;014 fork=1:4015 %圖形輸出016 subplot(2,2,k)017 %R2016a018 polarplot(theta,rho(k,:))019 %如果在R2016a版之前的MATLAB運行此腳本020 %請使用下面的命令替代第18行的代碼021 %polar(theta,rho(k,:))022 end023 disp('程序運行結束!')運行該腳本文件,則需要在MATLAB命令行窗體內鍵入相應的命令:>>script_example程序運行結束!MATLAB會出現相應的圖形窗體,如圖4-2所示。腳本文件主要由注釋行和代碼行組成。M文件的注釋行使用%定義,在%之后的所有單行文本都認為是M文件的注釋文本,注釋定義符“%”僅能影響一行代碼,類似于C++語言中“//”。如果需要像C語言注釋定義符“/*”和“*/”那樣來定義多行注釋,則需要在M語言文件中配對使用“%{”和“%}”創(chuàng)建多行注釋。這里需要注意,大括號要配對使用,而且都在“%”的后面。給程序添加適當的注釋是良好的編程習慣,希望讀者能夠在日常編程中多多使用。在M語言編輯器中,注釋是綠色的文本,如果使用多行注釋,則多行注釋可以通過注釋首行前的“減號”收起注釋文本,或者使用“加號”展開文本,如圖4-3所示。腳本文件中的代碼行都是一些簡單的MATLAB命令,這些命令可以用來完成相應的數值計算、數據處理、繪制圖形等操作,也可以在腳本文件中調用其他的腳本或者函數完成更復雜的功能。另外,在MATLAB中還有一些命令用來處理程序和用戶之間的交互,如表4-1所示。MATLAB一般使用腳本文件作為某種批處理文件,其中,有兩個批處理文件經常被MATLAB自動調用,這兩個腳本文件分別為startup.m和finish.m。其中,startup.m文件在MATLAB啟動時自動被執(zhí)行。用戶可以自己創(chuàng)建并編寫該文件,讓MATLAB啟動時實現某些自動化功能。當MATLAB在啟動時,將從當前的起始位置開始,執(zhí)行相應搜索路徑下的第一個startup.m文件。與startup.m文件相對應的是finish.m文件,該文件在MATLAB退出時自動執(zhí)行,用戶可以自己創(chuàng)建并編寫該文件,讓MATLAB在退出之前實現某些自動化功能。同樣,在<MATLABROOT>\toolbox\local路徑下有兩個文件,分別為finishsav.m和finishdlg.m,這兩個文件可以用作finish.m文件的模板,可以修改相應的模板文件,添加必要的內容后另存為finish.m文件。如果在退出MATLAB時,當前的工作目錄下存在finish.m文件,則MATLAB將運行當前工作目錄下的finish.m文件,而忽略在<MATLABROOT>\toolbox\local路徑下的finish.m文件。

4.3流程控制程序流程控制是指控制程序運行的基本結構和語法,如應用程序的選擇和循環(huán)結構(它們是結構化編程的基本結構)。使用結構化的應用程序設計方法可以使設計的程序結構清晰,可讀性強,能夠提高應用程序的設計效率,增強程序的可維護性。結構化的應用程序設計思想是現代程序設計的基礎。結構化的程序主要有三種基本的程序結構:順序結構、選擇結構、循環(huán)結構。所謂順序結構,就是指所有組成程序源代碼的語句按照由上至下的次序依次執(zhí)行,直到程序的最后一個語句,也就是程序語句的簡單羅列。選擇結構是依照不同的判斷條件進行判斷,然后根據判斷的結果選擇某一種方法來解決某一個問題的結構。循環(huán)結構就是在程序中某一條語句或者多條語句重復多次運行的結構。已經得到證明,上述三種程序結構足以處理各種各樣的復雜問題,將上述三種結構組合在一起就可以構成復雜的程序。一般M語言文件由上述三種結構的MATLAB命令構成。4.3.1選擇結構如前所述,當人們判斷某一條件是否滿足,根據判斷的結果來選擇解決問題的不同方法時,就需要使用選擇結構。和C語言類似,MATLAB的條件判斷可以使用if語句或者switch語句。1.?if語句if語句的基本語法結構有三種,分別如下:1)?if(關系運算表達式) MATLAB語句end這種形式的選擇結構表示當關系運算表達式的計算結果為邏輯真時,執(zhí)行MATLAB語句。這里的MATLAB語句可以是一句MATLAB命令,也可以是多句MATLAB命令。在MATLAB語句的結尾處必須有關鍵字end與if關鍵字相呼應。2)?if(關系運算表達式) MATLAB語句Aelse MATLAB語句Bend這種選擇結構表示當關系運算表達式的計算結果為邏輯真時執(zhí)行MATLAB語句A,否則執(zhí)行MATLAB語句B。在語句B的結尾處必須有關鍵字end與if關鍵字相呼應。3)?if關系運算表達式a MATLAB語句Aelseif關系運算表達式b MATLAB語句Belseif關系運算表達式c …end這種選擇結構可以判斷多條關系運算表達式的計算結果,然后按照執(zhí)行的邏輯關系執(zhí)行相應的語句。讀者可以根據類似的C語言知識或者前面兩種選擇結構的介紹判斷這種結構的運算執(zhí)行方式。當所有的命令鍵入完畢后,需要將文件保存,讀者可以將其保存為任何名字。MATLAB規(guī)定M語言文件的文件名必須由英文字符、數字和下畫線組合構成,文件的擴展名必須設置為.m。M語言文件可以保存在MATLAB的搜索路徑中或者當前的工作目錄下。需要注意的是,MATLAB的命令對字符的大小寫敏感,而且MATLAB的命令一般與M語言文件的文件名稱一致,所以,在保存M語言文件時,文件名稱最好都使用小寫字符。保存了M語言文件之后,就可以嘗試運行。在MATLAB的命令行窗體中,鍵入剛才保存的文件名,這時不要將擴展名也一同鍵入,MATLAB就會依次執(zhí)行M語言文件包含的命令。運行MATLAB腳本程序還可以通過M語言編輯器工具條EDITOR標簽頁下的Run按鈕來實現。在運行代碼前,M語言編輯器會自動保存相應的代碼文件。2.?switch語句另外一種在M語言程序中構成選擇結構的關鍵字就是switch。使用switch語句來處理多分支結構不僅可以提升程序的可讀性,還可以有效提升程序的執(zhí)行效率。它的基本語法結構如下:switch(表達式) case常量表達式a:語句A case常量表達式b:語句B … case常量表達式m:語句M otherwise:語句Nend在switch語句之后的表達式可以是一個數值類型的表達式或者數值類型的變量,當這個表達式的值同case后面的某一個常量表達式相等時,執(zhí)行該case分支常量表達式后面的語句。4.3.2循環(huán)結構在解決很多編程問題的時候需要使用循環(huán)結構。MATLAB中包含兩種循環(huán)結構:一種是循環(huán)次數不確定的while循環(huán),另一種是循環(huán)次數確定的for循環(huán)。1.?while循環(huán)結構while語句可以用來實現“當”型循環(huán)結構,它的一般形式如下:while(表達式)MATLAB語句end當表達式為真時,循環(huán)將執(zhí)行由語句構成的循環(huán)體。其特點是先判斷循環(huán)條件,如果循環(huán)條件成立,即表達式運算結果為“真”,再執(zhí)行循環(huán)體。循環(huán)體執(zhí)行的語句可以是一句,也可以是多句,在MATLAB語句之后必須使用關鍵字end與while語句呼應并且作為整個循環(huán)結構的結尾。另外,在組成循環(huán)體的語句的執(zhí)行過程中,一定要能夠改變關系表達式的邏輯判斷結果值,或者使用其他方法跳出循環(huán),否則會陷入死循環(huán)(無法正常退出的循環(huán)叫作死循環(huán))。2.?for循環(huán)結構使用for語句構成循環(huán)是最靈活、簡便的方法。使用for語句循環(huán)需要預先知道循環(huán)體執(zhí)行的次數,所以這種循環(huán)一般叫作確定循環(huán)。在MATLAB中,for循環(huán)的基本結構如下:forindex=start:increment:end MATLAB語句end其中,index的取值取決于start和end的值,一般地,這里通常使用等差數列。在for循環(huán)語句中,不僅可以使用行向量進行循環(huán)迭代的處理,也可以使用矩陣作為循環(huán)次數的控制變量,這時循環(huán)的索引值將直接使用矩陣的每一列,循環(huán)的次數為矩陣的列數。4.3.3break語句和continue語句在循環(huán)結構中還有兩條語句可以影響程序的流程,分別是break語句和continue語句。這兩條語句的基本功能是:當循環(huán)體包含break語句時,其作用是能夠在執(zhí)行循環(huán)體的時候強迫終止循環(huán),即控制程序的流程使其提前退出循環(huán)。當循環(huán)體包含continue語句時,其作用是能夠中斷本次的循環(huán)體運行,將程序的流程跳轉到判斷循環(huán)條件的語句處,繼續(xù)下一次的循環(huán)。4.3.4提高運算性能由于M編程語言是一種解釋型編程語言,所以M語言的執(zhí)行效率一般會低于編譯型語言(如C/C++語言)。然而,隨著MATLAB版本的不斷升級、計算機技術的發(fā)展,再加之MATLAB矩陣運算的合理利用,M語言代碼的執(zhí)行效率也得到了有效提高。1.向量化運算首先,開發(fā)MATLAB最初的目的是為廣大工程師們提供便利的矩陣運算和數據處理能力,它首先是一個科學計算軟件。所以在大多數應用程序中,應該盡量避免使用循環(huán)結構操作矩陣的元素,請直接使用矩陣元素的索引或者矩陣運算的函數來完成類似的工作。這樣做不僅可以提高代碼的執(zhí)行效率,還能夠提高程序的可讀性。這就是向量化的運算,也就是說,要避免使用while循環(huán)或者for循環(huán)的語句一個元素一個元素地處理矩陣或者數組的元素,將類似的代碼結構轉換成等價的向量或者矩陣運算,以提高運算速度。在MATLAB中需要盡量將循環(huán)迭代代碼改寫成數組或者矩陣的運算,這樣可以明顯提高程序的執(zhí)行效率。另外一種能夠提高運算效率的方法就是進行內存變量存儲空間的預分配。在編寫M語言程序的時候需要盡量使用內存的預分配,而少使用或者不使用數組內存空間的自動擴充,這樣可以讓代碼運行得更有效率,對內存的使用將更加優(yōu)化。MATLAB針對不同的數據類型有不同的預分配函數,見表4-2。表4-2中說明了不同數據類型變量需要使用的預分配內存函數,其中結構類型的數組需要兩個函數配合使用,利用struct函數構造結構,再使用repmat函數創(chuàng)建數組。對于非雙精度類型的數據進行內存的預分配時,例如整數類型或者單精度類型,需要使用相應的構造函數或者類型轉換函數。如果預先分配的內存空間無法容納數據,則可以通過repmat函數來擴充數組的存儲空間。

4.4函數文件函數文件是M文件最重要的組成部分。M語言函數文件能夠接受用戶的輸入參數,完成計算,并將計算結果作為函數的返回值返回給調用者。在MATLAB中具有不同類型的函數,分別為內建函數、系統(tǒng)M函數、系統(tǒng)MEX函數文件、用戶自定義MEX函數文件和用戶自定義的M文件。其中,內建函數(build-infunction)是MATLAB基本內核提供的函數。這些函數無法察看相應的代碼,只能直接使用,所以又被稱為MATLAB核心函數。4.4.1基本結構M語言函數文件和M語言腳本文件不同,函數文件需要有特殊的代碼構架,大多數函數具有特定的輸入參數和輸出參數,函數之間可以互相調用也可以調用腳本文件,但是不同的函數分別具有自己的工作空間,M語言函數的工作空間中具有局部變量也可以使用全局變量,這些內容都是掌握M語言函數開發(fā)的基礎。函數文件的基本代碼構架,參見例4-13?!纠?-13】函數文件示例—average.m。001 functiony=average(x)002 %AVERAGE例4-13求向量元素的均值003 %語法:004 %Y=average(X)005 %其中,X是向量,Y為計算得到向量元素的均值006 %若輸入參數為非向量則出錯007 008 %代碼行009 [m,n]=size(x);010 %判斷輸入參數是否為向量011 if(~((m==1)||(n==1))||(m==1&&n==1))012 %若輸入參數不是向量,則出錯013 error('Inputmustbeavector')014 end015 %計算向量元素的均值016 y=sum(x)/length(x);運行例4-13的代碼,在MATLAB命令行窗體中,鍵入下面的命令:>>z=1:99;>>y=average(z)y=50創(chuàng)建M語言函數文件時,也可以通過MATLAB工具條HOME標簽頁下New菜單內的Function命令來完成,這時在M語言編輯器內將創(chuàng)建一個空白的函數文件,如圖4-10所示。M語言函數文件具有下面幾個不同部分:函數定義行;在線幫助;注釋行;M語言代碼。下面結合例4-13的代碼分別說明這些部分的構成。例4-13的函數定義行為代碼的001行:001 functiony=average(x)這一行代碼中包括關鍵字function,函數輸出參數y,函數的名稱average和函數的輸入參數x。函數的名稱定義要求必須以字符開頭,后面可以用字符、數字和下畫線的組合構成函數名稱。MATLAB對函數名稱的長度有限制,可以在MATLAB中,通過執(zhí)行namelengthmax函數獲取相應的數值。假設該函數返回的數值為N,若函數的名稱長度超過了N,則MATLAB使用函數名稱的前N個字符作為函數名稱。一般地,推薦將函數名稱使用小寫的英文字符來表示,同時保存函數的M文件名稱要和函數名稱保持一致。若文件名稱和函數名稱不一致,則調用函數的時候需要使用文件名稱而非函數名稱。而且,在MATLAB中調用函數或者腳本的時候,調用命令的大小寫必須與函數或者腳本文件名稱的大小寫完全一致,否則會報告錯誤信息,例如在MATLAB命令行窗體中,鍵入下面的命令:>>y=Average(z)Cannotfindanexact(case-sensitive)matchfor'Average'Theclosestmatchis:averageinD:\MyDocuments\MyWorks\MATLAB\Class\ML01_v4\Ch4\average.m

Didyoumean:>>y=average(z)M函數文件的在線幫助為緊隨函數定義行的注釋行。函數的在線幫助可以使用help函數來獲取。MATLAB函數文件的在線幫助第一行被稱為H1幫助行,它是比較重要的“在線幫助”內容。如果使用lookfor函數搜索查詢函數,MATLAB僅查詢并顯示函數的H1幫助行,通過H1幫助行就能夠找到具有相應關鍵字的函數。由于H1幫助行的特殊作用,所以在用戶編寫自己的M函數文件時,一定要編寫相應函數的H1幫助行,對函數進行簡明扼要的說明或者解釋。在M語言編輯器中編輯函數文件時,編輯器通過相應的標識符表示函數的代碼范圍,例如function關鍵字所在行之前的“減號”或者“加號”,以及代碼的最后一行,同時,在線幫助部分也具有同樣的特性,可以很方便地收起或者展開文本,如圖4-11所示。在編寫MATLAB函數或者腳本文件時,不可避免需要調用MATLAB已有的函數。這時可以利用MATLAB的函數瀏覽器選擇合適的函數,以避免函數名稱鍵入不正確而帶來的錯誤。如果需要在M語言編輯器中打開函數瀏覽器,可以單擊M語言編輯器工具條EDITOR標簽頁Insert后的按鈕,如圖4-12所示。M語言編輯器中的函數瀏覽器使用方法與MATLAB命令行窗體的函數瀏覽器使用方法完全一致。在函數瀏覽器中,根據MATLAB產品模塊的不同分類列出相應的函數,這時可以在搜索框中鍵入需要的函數名字,例如鍵入average,則MATLAB將搜索得到相應的函數,如圖4-13所示。如果將鼠標放置在相應的函數上,MATLAB還能夠顯示該函數的在線幫助信息,效果如圖4-12所示那樣。函數瀏覽器是進行M語言應用程序開發(fā)時很好的輔助工具,可以幫助用戶快速搜索定位所需要的函數。4.4.2輸入/輸出參數一般情況下,M語言函數具有特定的輸入參數和輸出參數。M語言函數允許使用多個輸入參數和多個輸出參數,見例4-14?!纠?-14】多個輸入/輸出參數的M函數—ourstats.m。001 function[avg,stdev,r]=ourstats(x,tol)002 %OURSTATS例4-14多輸入/輸出參數示例003 %該函數計算處理矩陣,得到相應的均值004 %標準差和矩陣的秩005 [m,n]=size(x);006 ifm==1007 m=n;008 end009 %均值010 avg=sum(x)/m;011 %標準差012 stdev=sqrt(sum(x.^2)/m-avg.^2);013 %秩014 s=svd(x);015 r=sum(s>tol);運行例4-14,在MATLAB命令行窗體中,鍵入下面的命令:>>A=[324;-112;9510]A= 3 24 -1 12 9 510>>[a,s,r]=ourstats(A,0.001)a=3.66672.66675.3333s=4.10961.69973.3993r=2>>ourstats(A,0.001)ans=3.66672.66675.3333>>[a,s]=ourstats(A,0.001)a=3.66672.66675.3333s=4.10961.69973.3993>>[a,s,r,q]=ourstats(A,0.001)ErrorusingourstatsToomanyoutputarguments.>>[a,s,r]=ourstats(A,0.001,0.1)ErrorusingourstatsToomanyinputarguments.例4-14的M語言函數具有兩個輸入參數,三個輸出參數,所以在調用該函數的時候,需要給出必需的輸入/輸出參數。注意調用該函數時的語法,將輸出參數依次寫在一個向量中,若輸出參數的個數與函數定義的輸出參數個數不一致,將計算得到的前幾個輸出參數作為返回值,返回值的個數等于用戶指定的輸出參數個數,計算的結果依次賦值給不同的變量。就像例4-14調用ourstats函數那樣。如果在調用函數時,給定的輸入/輸出參數個數不滿足函數的要求,則會報告相應的錯誤。M語言函數的輸入/輸出參數在函數定義的時候不需要指出變量的數據類型,也不需要確定輸入參數的維數或者尺寸。當閱讀M語言函數代碼的時候無法直接判斷輸入參數是標量還是向量還是矩陣,也無法判斷其數據類型。雖然這種做法簡化了程序編寫的難度,提供了極大的靈活性,但是給程序執(zhí)行帶來了很多潛在的問題,開發(fā)人員需要在代碼內判斷調用函數的操作是否傳遞了正確的參數。4.4.3子函數同一個M函數文件中可以包含多個函數。如果,在同一個M函數文件中包含了多個函數,那么,出現在文件中的第一個M函數被稱之為主函數(PrimaryFunction),其余的函數被稱為子函數(Subfunction)。M函數文件的名稱必須與主函數的名稱保持一致,其他函數都必須按照函數的基本結構來書寫,每一個函數的開始都是函數定義行,函數的結尾是另一個函數的定義行的開始或者整個M文件的結尾(最后一個子函數的結尾就是文件結束符)。一般情況下,子函數可以沒有在線幫助,子函數的作用范圍有限,它只能被那些定義在同一個M函數文件中的其他函數(包含主函數和其他子函數)來調用,不能被其他M函數文件定義的函數或腳本調用。一般情況下子函數可以不編寫在線幫助,如果子函數有在線幫助,則可以通過help命令來訪問,例如可以在MATLAB命令行窗體中鍵入下面的命令,從而察看子函數median的在線幫助:>>helpnewstats>median計算中間值4.4.4局部變量和全局變量在M語言函數中存在局部變量和全局變量。所謂局部變量,就是那些在M函數內部聲明并使用的變量。這些變量僅能在函數調用執(zhí)行期間被使用,一旦函數結束運行,則這些變量占用的內存空間將被自動釋放,變量的數值也就不存在了。MATLAB通過解釋器來解析執(zhí)行M語言代碼,在調用函數文件時,MATLAB為不同的函數創(chuàng)建不同的工作空間,這就是函數的局部空間。這些工作空間之間彼此獨立,一旦函數執(zhí)行完畢,則函數的工作空間就不存在了。而所謂全局變量則是那些保存在MATLAB全局工作空間中的變量,這些變量只有在執(zhí)行clear命令或者退出MATLAB時才會被徹底釋放。一般情況下,腳本文件使用MATLAB的基本工作空間。4.4.5函數執(zhí)行規(guī)則只要在MATLAB的命令行窗體中,鍵入函數的名稱,并且提供正確的輸入/輸出參數就會得到正確的結果。M語言文件被MATLAB解釋器解釋執(zhí)行,當用戶在MATLAB命令行窗體鍵入一個命令或者執(zhí)行M語言文件所包含的一條語句或者命令時,MATLAB解釋器根據相應的規(guī)則負責解析用戶的輸入,并且給出相應的答案。MATLAB解釋器解析函數調用的優(yōu)先級如下:(1)首先判斷相應的命令是否為變量;(2)若不是當前工作空間中的變量,判斷相應的命令是否為MATLAB的內建函數;(3)若不是內建函數,則判斷相應的命令是否為當前函數文件內的子函數;(4)若不是子函數,則為函數文件,則開始在當前的工作目錄下搜索是否存在相應的函數文件;(5)若當前的工作目錄下沒有找到相應的函數文件,則開始按照搜索路徑的次序搜索相應的函數文件;(6)若在同一個路徑下發(fā)現同名的三種類型的文件MEX文件、P代碼文件和M代碼文件,則優(yōu)先執(zhí)行MEX文件,其次是P代碼文件,最低的優(yōu)先級是M語言文件;(7)若在任意路徑下都沒有找到相應的函數文件或腳本文件,則系統(tǒng)報錯。

4.4函數文件4.5.1一般調試過程一般來說,應用程序的錯誤有兩類,一類是語法錯誤,另外一類是運行時錯誤。其中,語法錯誤包括了詞法或者文法的錯誤,例如函數名稱的錯誤拼寫,調用函數時使用了錯誤的輸入輸出參數等。而運行時錯誤是指那些程序可以運行,但是運行過程得到的結果不是用戶需要的情況。不論是哪一種錯誤,都必須在開發(fā)的過程中找到錯誤并且給予修正。由于M語言是一種解釋型語言,語法錯誤和運行時錯誤大多都是在代碼運行過程中才被發(fā)現,所以程序的調試往往是在程序無法得到正確結果時進行程序修正的重要手段。隨著MATLAB版本的不斷升級,發(fā)現并且定位M語言文件所包含的錯誤的手段越來越豐富。這里結合具體的例子說明M文件一般調試的過程?!纠?-18】M文件調試代碼—stats_error.m。001 function[totalsum,average]=stats_error(input_vector)002 %STATS_ERROR例4-18計算輸入參數的和值和均值003 totalsum=sum(input_vector);004 average=ourmean(input_vector);005 006 functiony=ourmean(x)007 %OURMEAN-計算均值008 [m,n]=size(x);009 ifm==1010 m=n;011 end012 y=sum(input_vector)/m;首先在MATLAB命令行窗體中嘗試執(zhí)行上面的函數:>>[sumavg]=stats_error(rand(1,50))Unrecognizedfunctionorvariable'input_vector'.Errorinstats_error>ourmean(line12)y=sum(input_vector)/m;Errorinstats_error(line4)average=ourmean(input_vector);MATLAB的命令行窗體中會顯示錯誤信息,錯誤信息是紅色的字體,并且在Errorin后面的文字具有下畫線,是出現錯誤的代碼行超鏈接,如圖4-14所示。如果此時單擊超鏈,則會顯示函數的在線幫助窗體,里面的內容是函數的在線幫助,如圖4-15所示。如果此時單擊命令行窗體中錯誤信息ErrorIn后面的行號(line12),則MATLAB會啟動M語言編輯器并且打開出錯的代碼文件,同時將光標停留在出現錯誤的代碼行。此時就可以利用M語言編輯器設置斷點完成代碼的調試。斷點的設置可以通過M語言編輯器工具條EDITOR標簽中的Breakpoints菜單命令來創(chuàng)建,如圖4-16所示。由于在前面的操作中,M語言編輯器已經自動定位到了出現錯誤的代碼行(第12行),則此時可以通過該菜單下的Set/Clear菜單命令來設置程序斷點,具體方法是確認光標停留在M語言編輯器的第12行,然后執(zhí)行M語言編輯器工具條EDITOR標簽相應的Breakpoints菜單下的Set/Clear菜單命令,或者直接使用快捷鍵—F12來設置斷點,或者用鼠標左鍵單擊M語言編輯器左側欄代碼行號邊上的短橫線,也可以設置標準斷點。此時,在代碼的第12行,也就是出現錯誤的代碼行,左側用紅色的圓點標識斷點,如圖4-17所示。設置好斷點之后,再次使用同樣的命令運行該函數。由于代碼設置有程序斷點,所以這次運行時MATLAB不會報告代碼運行錯誤,而是進入到調試狀態(tài)。進入到調試狀態(tài)時,MATLAB的命令行窗體中會顯示當前斷點的代碼行,并且命令行窗體提示符變成“K>>”,表示當前MALTAB的狀態(tài)為調試狀態(tài)。此時,在M文件編輯器中,第12行代碼前有綠色的箭頭,表示當前程序運行在此處中斷,如圖4-18所示。由于M語言編輯器窗體尺寸的原因,圖4-18所示的EDITOR工具條部分內容被縮減,可以通過拉寬M語言編輯器窗體來顯示完整的工具條。調試模式下,M語言編輯器會顯示與代碼調試相關的菜單命令按鈕,如圖4-19所示。這些按鈕分別是繼續(xù)執(zhí)行(Continue)、單步執(zhí)行(Step)、進入函數(Stepin)、跳出函數(Stepout)、運行至光標(RuntoCursor)、函數調用堆棧(FunctionCallStack)以及退出調試模式(QuitDebugging)等調試程序的功能。將鼠標光標移動到按鈕處并保持幾秒鐘,M語言編輯器能夠給出相應的提示。通過M語言編輯器用戶界面中的Stack下拉列表框可以了解當前應用程序使用的堆棧狀態(tài),例如本例子中Stack下拉列表框中包含ourmean、stats_error和Base,由下至上,分別為調用者和被調用者之間的關系,同時

溫馨提示

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

評論

0/150

提交評論