MATLAB(1)——基本調試方法(Debug)
鏈接:http://www.cnblogs.com/xingshansi/articles/6477185.html
前言
之前經常用MATLAB,卻不小心停留在了舒適區,連基本的調試方法都沒有掌握。本文主要是對MATLAB程序調試中的一般方法進行總結,也是自己學習的記錄。全文大致分為三個段落: 1)代碼內調試; 2)斷點調試方法; 3)指令調試方法; 本文主要為個人學習總結,並借鑒了前人的經驗,相應鏈接在最后一並附上。 |
一、代碼內調試
A-打印變量
1
2
3
|
z=hilbert(testdata');
% 希爾伯特變換
a=
abs
(z)
% 包絡線
fnor=instfreq(z);
% 瞬時頻率
|
上面的代碼,如果希望檢查a是否正常:去掉末尾的分號;,即可在Command Window查看到對應的輸出信息,特別是當變量出現在function時,如果不輸出,則在Workspace中無法直接查看,此時該操作較方便。
B-局部執行
1
2
3
|
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
通常聯合使用。如執行:
1
|
max_eig =
max
(
eig
(G
'*pinv(F)*G) ); %此處難以確定,還是max_eig = max( eig(G*pinv(F)*G'
) )
|
1
|
P_tmp =
real
(m+1 - max_eig);
|
但難以確定G還是G’,利用keyboard則可以修改為:
1
2
3
|
keyboard
P_tmp =
real
(m+1 - max_eig);
|
在進入K>> 之后,此時已經可以觀察F、G的size,因此在Command Windows輸入:
1
2
|
max_eig =
max
(
eig
(G'*
pinv
(F)*G) );
return
;
|
即可保證程序順利執行。
B-try + (catch) +end
我們知道,matlab的代碼是按行執行的,如果碰到錯誤行,則程序中斷。try..catch可以使得可能出錯的代碼不影響后面代碼的繼續執行,也可以檢查,排查,解決程序的一些錯誤,增強代碼的魯棒性和可靠性。
- try ... end
1
2
3
4
5
6
7
|
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用於檢查錯誤,如
1
2
3
4
5
6
7
8
9
10
|
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
在程序執行前輸入:
1
2
3
|
dbstop
if
error
%================以下為main部分=================
....
%略
|
如果運行出現錯誤,matlab會自動停在出錯的那行,並且保存所有相關變量。真心好用。
- dbstop in file
在.m文件中,插入dbstop in file指令,如下面這段程序,我們在其中加入了dbstop in VMD,其中VMD是一個function:
1
2
3
4
5
6
7
8
|
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, 如下:
1
2
3
4
5
6
7
|
clear
all
;
close
all
clc
;
x =
ones
(1,10);
for
n = 1:10
x(n) = x(n) + 1;
end
|
設置一個斷點在 n >= 4時(對應程序位置為第6行),然后再運行程序:
1
2
|
dbstop
in myprogram at 6
if
n>=4;
myprogram;
|
這時有:
1
2
3
|
6 x(n) = x(n) + 1;
K>>
Type
dbquit
to
exit
debug
mode
.
|
可見,dbstop比斷點設置更加智能,控制起來更為方便。補充一句:
1
|
dbstop
in file at location
%在指定行設置斷點
|
此時與F12等價。
所有dbstop,可配合return或者dbstop使用;
return:返回;
dbstop:停止
調試完成,需要清除所有斷點:
- 清除所有M文件的所有斷點
在Command Windows輸入:
1
|
dbclear
all
|
- 清除文件名為mfile的文件的所有斷點
在Command Windows輸入:
1
|
dbclear
all
in mfile:
|
- 其他dbstop相關(前文所述,已滿足基本Debug,此處列出其他操作,不再展開介紹,供感興趣的朋友閱讀):
(1)設置斷點: * dbstop in mfile:在文件名為mfile的M文件第一個可執行語句前設斷點; (2)斷點清除: * dbclear all:清除所有M文件中的所有斷點; (3)恢復運行: * dbcount:從斷點處恢復程序的執行,直到下一個斷點或錯誤后返回Matlab基本工作空間; (4)執行一行或多行語句: * dbstep:執行下一個可執行語句; * 注:這四種都返回調試模式,如遇斷點,中止; 參考:
斷點調試:
http://fouvy.info/post/24542809639/matlab%E4%BB%A3%E7%A0%81%E8%B0%83%E8%AF%95%E6%8A%80%E5%B7%A7
|