zoukankan      html  css  js  c++  java
  • 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:执行函数剩余部分,离开函数时停止;
    * 注:这四种都返回调试模式,如遇断点,中止;

    参考:

  • 相关阅读:
    HDU 4348 To the moon(可持久化线段树)
    HDU 5875 Function 大连网络赛 线段树
    HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)
    HDU 5876 大连网络赛 Sparse Graph
    HDU 5701 中位数计数 百度之星初赛
    CodeForces 708B Recover the String
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    ASP.NET生成验证码
    ASP.NET生成验证码
    ASP.NET生成验证码
  • 原文地址:https://www.cnblogs.com/xingshansi/p/6477185.html
Copyright © 2011-2022 走看看