前言

之前经常用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 = maxeig(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 = maxeig(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:执行函数剩余部分,离开函数时停止;
注:这四种都返回调试模式,如遇断点,中止;

MATLAB(1)的更多相关文章

  1. 《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)

    http://www.matlabsky.com/thread-43937-1-1.html   <量化投资:以MATLAB为工具>连载(3)基础篇-N分钟学会MATLAB(下)     ...

  2. 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)

    http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...

  3. 矩阵卷积Matlab(转载)

    转载自:http://blog.csdn.net/anan1205/article/details/12313593 两个矩阵卷积转化为矩阵相乘形式--Matlab应用(这里考虑二维矩阵,在图像中对应 ...

  4. Newman的 power law 参数估计的程序matlab(转载)

    转自:http://blog.sciencenet.cn/blog-4716-46173.html 对于幂率分布的估计问题是个很复杂的问题(..., the empirical detection a ...

  5. MATLAB(5)——生成归一化直方图

    作者:桂. 时间:2017-03-10  22:13:36 链接:http://www.cnblogs.com/xingshansi/p/6533579.html 声明:欢迎转载,不过记得注明出处哦~ ...

  6. rand ----MATLAB (经典)

    最近一直在学习matlab,我相信有一些同学已经发现,最近更新的关于matlab的内容比较多, 希望能够帮助到未来的小学弟学妹们! 永远爱你们的 ----新宝宝 rand 均匀分布的随机数全页折叠 语 ...

  7. PCA (主成分分析)详解 (写给初学者) 结合matlab(转载)

    一.简介 PCA(Principal Components Analysis)即主成分分析,是图像处理中经常用到的降维方法,大家知道,我们在处理有关数字图像处理方面的问题时,比如经常用的图像的查询问题 ...

  8. MATLAB(3)——GUI界面设计入门

    作者:桂. 时间:2017-03-01  18:43:35 链接:http://www.cnblogs.com/xingshansi/articles/6485688.html 声明:转载请注明出处, ...

  9. MATLAB(1)——基本调试方法(Debug)

    作者:桂. 时间:2017-02-28  07:06:30 链接:http://www.cnblogs.com/xingshansi/articles/6477185.html 声明:转载请注明出处, ...

  10. $ 一步一步学Matlab(3)——Matlab中的数据类型

    小学时候我们就知道,数学中有自然数.整数.分数.小数等等很多种类型的数.到了中学,我们又发现了其实还有无理数.复数这些有些特殊的数.到了大学学了高等数学之后,我们又知道了其实还存在着无穷大.无穷小这样 ...

随机推荐

  1. nginx 编译某个模板的问题./configure: error: SSL modules require the OpenSSL library. You can either do not enable the modules, or install the OpenSSL library into the system, or build the OpenSSL library stati

    root@hett-PowerEdge-T30:/usr/local/src/nginx-1.9.8# ./configure --prefix=/usr/local/nginx  --add-mod ...

  2. UVA - 1395 Slim Span (最小生成树Kruskal)

    Kruskal+并查集. 点很少,按边权值排序,枚举枚举L和R,并查集检查连通性.一旦连通,那么更新答案. 判断连通可以O(1),之前O(n)判的,第一次写的过了,后来T.. #include< ...

  3. C++类型强制转换<转>

    转载:http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html C风格的强制类型转换(Type Cast)很简单,不管什么类型 ...

  4. 浏览器window产生的缓存九种解决办法

    浏览器缓存(Browser Caching)是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户.浏览器 ...

  5. JAVA web项目转客户端(nativefier)

    1.环境:windows 2.下载node.js 3.安装mode.js;记住安装目录 4.命令行进入安装目录 5.执行语句: npm install nativefier –g 进行安装 6.新建空 ...

  6. iOS面试集锦3

    1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSStringEnco ...

  7. tableview 删除cell

    正如在以前的帖子说,但是我在转到故事版(StoryBoard)教程之前,我有另外一个问题来回答. 我如何从UITableView删除一行呢? 当人们构建简单的表视图引用程序后,这是另一个常见的​​问题 ...

  8. ios 之CGRectMake

    首先要弄懂几个基本的概念. 一)三个结构体:CGPoint.CGSize.CGRect 1.  CGPoint [plain] view plaincopy   /* Points. */ struc ...

  9. 【转发】【linux】【ftp】CentOS 7.0安装配置Vsftp服务器

    adduser -d /var/www/android -g ftp -s /sbin/nologin ftp2 一.配置防火墙,开启FTP服务器需要的端口 CentOS 7.0默认使用的是firew ...

  10. PAT Basic 1035

    1035 插入与归并 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序 ...