matlab的調試


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
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文件第一個可執行語句前設斷點;
* dbstop in mfile at lineno:在mfile的第lineno行設斷點;
* dbstop in mfile at subfun:當程序執行到子程序subfun時,暫時中止執行,並設斷點;
* dbstop if error:遇到錯誤時,終止M文件運行,並停在錯誤行(不包括try...catch語句中檢測到的的錯誤,不能在錯誤后重新開始運行);
* dbstop if all error:遇到任何類型錯誤均停止(包括try...catch語句中檢測到的的錯誤);
* dbstop if warning:程序可恢復運行;
* dbstop if caught error:當try...catch檢測到運行時間錯誤是,停止M文件執行,可恢復運行;
* dbstop if naninf 或 dbstop if infnan

(2)斷點清除:

* dbclear all:清除所有M文件中的所有斷點;
* dbclear all in mfile:清除文件名為mfile的文件中的所有斷點;
* dbclear in mfile:清除文件名為mfile中第一個可執行語句前的斷點;
* dbclear in mfile at lineno:
* dbclear in mfile at subfun:
* dbclear if error/warning/naninf/infnan:

(3)恢復運行:

* dbcount:從斷點處恢復程序的執行,直到下一個斷點或錯誤后返回Matlab基本工作空間;

(4)執行一行或多行語句:

* dbstep:執行下一個可執行語句;
* dbstep nlines:執行下nlines行可執行語句;
* dbstep in:執行下一行可執行語句,如有子函數,進入;
* dbstep out:執行函數剩余部分,離開函數時停止;

注:這四種都返回調試模式,如遇斷點,中止;

參考:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM