作者:桂。
時間:2017-02-28 07:06:30
鏈接:http://www.cnblogs.com/xingshansi/articles/6477185.html
聲明:轉載請注明出處,謝謝。
前言
之前經常用MATLAB,卻不小心停留在了舒適區,連基本的調試方法都沒有掌握。本文主要是對MATLAB程序調試中的一般方法進行總結,也是自己學習的記錄。全文大致分為三個段落: 1)代碼內調試; 2)斷點調試方法; 3)指令調試方法; 本文主要為個人學習總結,並借鑒了前人的經驗,相應鏈接在最后一並附上。 |
一、代碼內調試
A-打印變量
z=hilbert(testdata'); % 希爾伯特變換 a=abs(z) % 包絡線 fnor=instfreq(z); % 瞬時頻率
上面的代碼,如果希望檢查a是否正常:去掉末尾的分號;,即可在Command Window查看到對應的輸出信息,特別是當變量出現在function時,如果不輸出,則在Workspace中無法直接查看,此時該操作較方便。
B-局部執行
z=hilbert(testdata'); % 希爾伯特變換
a=abs(z); % 包絡線 fnor=instfreq(z); % 瞬時頻率
如果希望對某一部分代碼,進行調試,則完全沒有必要每次都從頭運行,這時局部執行較方便。仍是這段代碼,如果希望僅僅執行高亮部分,則箭頭選中並按F9,此時程序僅僅運行高亮部分,可利用這個方法調試局部代碼。
C-配合繪圖(該操作可以配合以下各類方法使用)
圖形比數據更易於觀察,在調試過程中打開Workspace中的變量(快捷鍵:Crtl + D),然后選擇plot,即可根據需求對數據進行繪圖,便於觀察特性:
例如選擇需要觀察的數據,分別選擇bar以及surf指令,即可繪制對應圖形:
是不是也算方便?
二、斷點調試方法
調試代碼最經典的就是利用設置斷點的方法,此處給出對應快捷鍵:
- F12:設置/取消 斷點
- F10:單步執行
- F11:單步執行,且碰到function跳入函數內執行,F10則不會跳入,這是二者的明顯區別
- Shift + F11:跳入function之后,通過該指令推出function
- F5:執行相鄰兩次斷點見的所有指令,如:斷點在for循環中,則F5一次,循環執行一次
- Shift + F5:退出斷點調試
三、指令調試方法
A-keyboard +(return)
經常碰到一些情況,如:矩陣相乘A*B時(假設A已知,B需要運算得出),矩陣B的size難以確定,是用A*B還是A'*B難以確定,可不可以先計算B,運算完之后觀察B的特性,再確定用A還是A‘?keyboard可以解決這個問題。
keyboard顧名思義,就是鍵盤的意思,即:把控制權交給鍵盤。執行程序的過程中,把控制權交給鍵盤,如何再重新返回程序呢?因此:
keyboard 與 return
通常聯合使用。如執行:
max_eig = max( eig(G'*pinv(F)*G) ); %此處難以確定,還是max_eig = max( eig(G*pinv(F)*G') )
P_tmp = real(m+1 - max_eig);
但難以確定G還是G’,利用keyboard則可以修改為:
keyboard P_tmp = real(m+1 - max_eig);
在進入K>> 之后,此時已經可以觀察F、G的size,因此在Command Windows輸入:
max_eig = max( eig(G'*pinv(F)*G) ); return;
即可保證程序順利執行。
B-try + (catch) +end
我們知道,matlab的代碼是按行執行的,如果碰到錯誤行,則程序中斷。try..catch可以使得可能出錯的代碼不影響后面代碼的繼續執行,也可以檢查,排查,解決程序的一些錯誤,增強代碼的魯棒性和可靠性。
- try ... end
m = rand(3,4); n = magic(5); try a = m*n; disp(a) end disp(m)
這段代碼里面,a = m*n運行會出錯,不滿足矩陣乘法的原則。所以,a = m*n和disp(a)不執行,但后面的disp(m)亦然會執行。
- try...catch...end
try...catch...end用於檢查錯誤,如
m = rand(3,4); n = magic(5); try a = m*n; disp(a) catch disp(size(m)) disp(size(n)) end disp(m)
這里面,當程序碰到 a = m*n;錯誤后,就會跳轉到catch里面的語句,繼續執行,有點類似於if...else...end。
C-dbstop
- dbstop if error
在程序執行前輸入:
dbstop if error %================以下為main部分================= ....%略
如果運行出現錯誤,matlab會自動停在出錯的那行,並且保存所有相關變量。真心好用。
- dbstop in file
在.m文件中,插入dbstop in file指令,如下面這段程序,我們在其中加入了dbstop in VMD,其中VMD是一個function:
load './data/Gdpyear.mat' data=data-mean(data);%去均值,即數據中心化 dbstop in VMD t=linspace(1992.0,2016.5,length(data)); %設定x軸 for st=1:9 K=st+1; [u, u_hat, omega] = VMD(data, length(data), 0, K, 0, 1, 1e-5); u=flipud(u);
效果如下:
即設置斷點並運行至VMD程序內部,此時通過F10/F11/Shift F11等斷點操作中的快捷鍵,即可進行調試,Command Windows輸入dbquit即可退出。
- dbstop in file at location if expression
比如有myprogram.m, 如下:
clear all; close all clc; x = ones(1,10); for n = 1:10 x(n) = x(n) + 1; end
設置一個斷點在 n >= 4時(對應程序位置為第6行),然后再運行程序:
dbstop in myprogram at 6 if n>=4; myprogram;
這時有:
6 x(n) = x(n) + 1; K>> Type dbquit to exit debug mode.
可見,dbstop比斷點設置更加智能,控制起來更為方便。補充一句:
dbstop in file at location %在指定行設置斷點
此時與F12等價。
所有dbstop,可配合return或者dbstop使用;
return:返回;
dbstop:停止
調試完成,需要清除所有斷點:
- 清除所有M文件的所有斷點
在Command Windows輸入:
dbclear all
- 清除文件名為mfile的文件的所有斷點
在Command Windows輸入:
dbclear all in mfile:
- 其他dbstop相關(前文所述,已滿足基本Debug,此處列出其他操作,不再展開介紹,供感興趣的朋友閱讀):
(1)設置斷點: * dbstop in mfile:在文件名為mfile的M文件第一個可執行語句前設斷點; (2)斷點清除: * dbclear all:清除所有M文件中的所有斷點; (3)恢復運行: * dbcount:從斷點處恢復程序的執行,直到下一個斷點或錯誤后返回Matlab基本工作空間; (4)執行一行或多行語句: * dbstep:執行下一個可執行語句; |
參考: