工具使用——MATLAB基本调试方法
作者:桂。
时间: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
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文件第一个可执行语句前设断点; (2)断点清除: * dbclear all:清除所有M文件中的所有断点; (3)恢复运行: * dbcount:从断点处恢复程序的执行,直到下一个断点或错误后返回Matlab基本工作空间; (4)执行一行或多行语句: * dbstep:执行下一个可执行语句; |
参考:
工具使用——MATLAB基本调试方法的更多相关文章
- 【matlab】MATLAB程序调试方法和过程
3.8 MATLAB程序的调试和优化 在MATLAB的程序调试过程中,不仅要求程序能够满足设计者的设计需求,而且还要求程序调试能够优化程序的性能,这样使得程序调试有时比程序设计更为复杂.MATLAB ...
- matlab的调试方法
• 常用的调试方法.• (1) 设置或清除断点:使用快捷键F12. • (2) 执行:使用快捷键F5.• (3) 单步执行:使用快捷键F10. • (4) step in:当遇见函数时,进入函数内部, ...
- MATLAB(1)——基本调试方法(Debug)
作者:桂. 时间:2017-02-28 07:06:30 链接:http://www.cnblogs.com/xingshansi/articles/6477185.html 声明:转载请注明出处, ...
- Linux环境下段错误的产生原因及调试方法小结(转)
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...
- Linux环境下段错误的产生原因及调试方法小结
转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...
- Linux - Shell脚本调试方法
Shell脚本调试选项 Shell本身提供一些调试方法选项: -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误. -v,一边执行脚本,一边将执行过的脚本命令打印到标准输出. -x,提供跟踪执 ...
- JavaScript常见调试方法
编辑导语:javascript调试方法,常见使用alert和console来定位出错和输出的结果是否是想要的,在chrome中,还可以使用断点来看运行的情况等,本文介绍了比较全面的调试方法,你知道co ...
- Linux内核调试方法总结【转】
转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...
- 【转】【调试技巧】Linux环境下段错误的产生原因及调试方法小结
本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 1. 段错误是什么 ...
随机推荐
- SVN下载分支、合并分支
http://www.cnblogs.com/armyfai/p/3985660.html(不知道实际工作中怎么使用,有好多步骤感觉不是太理解) 从远处把库fork到本地,会有一个库文件夹 服务器库结 ...
- SQL SERVER 2000 数据恢复(分离数据库+附加数据库)
一.分离数据库 SQL Server 2000允许分离数据库的数据和事务日志文件,然后将其重新附加到同一台或另一台服务器上.分离数据库将从SQL Server 删除数据库,所以当点击“分离数据 ...
- 基于arm开发板四个按键控制四个灯亮
基于s5pv2410,cortex a8的四个按键每一个按键点了对应的灯 对于用汇编来编程的话不难,重点在于数据手册,电路图,管脚的看懂 直接上代码 .globl _start_start: ldr ...
- IDEA Show Line Number
刚开始用IDEA,经常发现右侧没有显示行号,然后去右键选一下,就显现了 一直没有留意这个现象,刚用vim想删几行数据代码,突然发现没有行号了 明明记得刚刚才右键显示了的 好吧,有行号用着比较顺心了.. ...
- Bootstrap3写的红色警告框样式组件
用的是BT3的类和fa的图标 <!DOCTYPE html><html><head lang="en"> <meta charset ...
- Linux下修改键盘映射
一篇关于修改键盘映射比较靠谱的文章,收藏一下! 原文地址:http://www.07net01.com/2016/04/1436249.html --------------------------- ...
- iOS NSTimer
示例: //创建 scrollTimer =[NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selecto ...
- leetcode[170]Two Sum III - Data structure design
Design and implement a TwoSum class. It should support the following operations: add and find. add - ...
- oracle.jdbc.driver.OracleDriver和oracle.jdbc.OracleDriver这两个驱动的区别
http://blog.csdn.net/agromach/article/details/1659463
- JavaWeb知识回顾二
动态web资源相关 1.tomcat相关 tomcat的目录结构 bin -- tomcat服务器的批处理文件的存放目录 conf -- tomcat服务器配置文件的存放目录 lib -- tomca ...