MATLAB程式设计入门篇程式除错.ppt
MATLAB 程式設計入門篇程式除錯,張智星(Roger Jang)http:/mirlab.org/jang清大資工系 多媒體檢索實驗室,17-1 簡介,MATLAB 的除錯器(Debugger)功能包含:查詢每一個函數的工作空間(Workspace)顯示函數呼叫過程中的的堆疊(Function Call Stack)一列一列地執行 M 檔案(Step-by-step Execution)一般程式語言的錯誤分類語法錯誤邏輯錯誤,17-2 一般除錯技巧(1/2),一般偵測邏輯錯誤的方法:去除運算式最尾端的分號,運算式執行的結果會印在 MATLAB 指令視窗中。在程式中加入 keyboard 指令,可使程式執行至此處即暫停,並顯示“k”的提示號(k 代表 keyboard),以便查看或改變工作空間的任何變數,若要繼續執行程式,可在 MATLAB 指令視窗下輸入“return”並按下 Enter 鍵。,17-2 一般除錯技巧(2/2),使用判斷式及 fprintf 指令印出變數的值。在除錯一個單獨函數時,可在其第一列的函數宣告列加上%,並定義輸入引數的值,此時我們就可以直接以腳本(Scripts)的方式來執行此 M 檔案,並保留所有變數於 MATLAB 工作空間之中。使用 MATLAB 的除錯器。,17-3以命令列為主的除錯程式(1/2),17-3以命令列為主的除錯程式(2/2),dbstop 的一般格式及相關說明,可以利用dbstop來指定程式碼的中斷點,離開除錯模式後的動作,進入除錯模式後,可檢查任何變數的值,也可以執行其他任何指令或手稿(script)。檢查完畢後,可能採取的動作有:,dbstep 的格式及說明,dbstep可以一次執行一列或多列程式碼,或是進入或跳出一個指令的內部程式碼。,dbclear及dbstatus 的用法,dbclear 用於取消中斷點,用法與dbstop的格式同,只需將dbstop改成dbclear。若要清除所有的中斷點,可用 dbclear all。dbstatus 可列出所有的中斷點。,實例:計算一向量的倒數和,範例:recipsum.m此函數包含一錯誤,執行時即會出現:,type recipsumfunction out=recipsum(x)recip=reciproc(x);out=sum(recip);function output=reciproc(input)output=1./x;,recipsum(1 2 3)?Input argument x is undefined.Error in=D:matlabBookMATLAB程式設計:基本篇17-程式除錯recipsum.mOn line 3=recip=reciproc(x);,使用dbstop及dbstatus,讓MATLAB 停留在產生錯誤訊息的函數:dbstop if error確認所建的中斷條件:dbstatus Stop if error.再呼叫原函數,會停在錯誤發生的程式碼:,使用dbstack及dbtype,此時可在指令視窗使用 dbstack 來顯示 MATLAB 所在的函數:亦可用 dbtype 來顯示程式碼:,k dbstack In recipsumreciproc at 7 In recipsum at 3,k dbtype 1 function out=recipsum(x)2 3 recip=reciproc(x);4 out=sum(recip);5 6 function output=reciproc(input)7 output=1./x;,使用dbquit、dbup及dbdown,在除錯器中將x改成input,則正確答案為:當程式暫停執行於一個函數時,可以使用 dbup 及 dbdown 來跳到不同的工作空間,以便檢視各變數。,k dbquit%離開除錯模式 recipsum1(1 2 3)ans=1.8333,設立中斷條件,上述範例修正後的檔案為recipsum1.m,執行時還是可能會有問題=Divide by zero.另設一個中斷條件來檢查錯誤所在,再呼叫函數:,recipsum1(2 0 2)ans=Inf,dbstop if naninf recipsum1(2 0 2)NaN/Inf breakpoint hit for recipsum1 on line 4.4 out=sum(recip);K,除錯後的最終結果,假設在輸入為 0 時,其倒數不計,則程式碼可修正如下,recipsum2.m:正確答案為:,k dbquit%離開除錯模式 type recipsum2 function out=recipsum(x)recip=reciproc(x);out=sum(recip);function output=reciproc(input)input(find(input=0)=;%Eliminate 0 elements output=1./input;,recipsum2(2 0 2)ans=1,17-4以圖形介面進行程式除錯,進行除錯,可由指令列下達 edit 或 open 指令,例如:edit recipsum1 可開啟 MATLAB 除錯器(也是編輯器),除錯指令與圖示,設立中斷點(1),欲設立中斷點於 reciproc 函數的第一列,可利用滑鼠將游標置於該列並點取 圖示。(紅點,代表中斷點),設立中斷點(2),若執行此函數,即可停於該中斷點:recipsum1(1 2 3)(綠色箭號顯示現在所在的位置),檢視變數或運算式,中斷後可在指令列檢視各個變數的值,或選取工具列上的 stack 下接式選單,以跳至不同的工作空間。檢視變數或運算式有三:將游標移到變數附近在指令列輸入變數或運算式。選取變數或運算式後,利用滑鼠右鍵點取,並選擇“Evaluate Selection”。,逐步執行,若按下 圖示(或在指令列輸入 dbstep),則綠色箭號變成向下,代表即將離開此次函數。再按(或於指令列輸入 dbstep)數次,即可完成整個函數的逐步執行。,不同版本的MATLAB圖示對應關係,