MATLAB(1)——基本調試方法(Debug)


作者:桂。

時間: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
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文件第一個可執行語句前設斷點;
* 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