作者:桂。
时间:2017-02-28 07:06:30
链接:
前言
之前经常用 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,此时程序仅仅运行高亮部分,可利用这个方法调试局部代码。
二、断点调试方法
调试代码最经典的就是利用设置断点的方法,此处给出对应快捷键:
三、指令调试方法
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 可以使得可能出错的代码不影响后面代码的继续执行,也可以检查,排查,解决程序的一些错误,增强代码的鲁棒性和可靠性。
- 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 用于检查错误,如
- 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
- %================以下为main部分=================
- ....%略
如果运行出现错误,matlab 会自动停在出错的那行,并且保存所有相关变量。真心好用。
在. 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 即可退出。
比如有 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 等价。
调试完成,需要清除所有断点:
在 Command Windows 输入:
- dbclear all
在 Command Windows 输入:
- dbclear all in mfile:
(1)设置断点: * dbstop in mfile: 在文件名为 mfile 的 M 文件第一个可执行语句前设断点; (2)断点清除: * dbclear all: 清除所有 M 文件中的所有断点; (3)恢复运行: * dbcount: 从断点处恢复程序的执行,直到下一个断点或错误后返回 Matlab 基本工作空间; (4)执行一行或多行语句: * dbstep:执行下一个可执行语句; |
参考:
dbstop 参考:断点调试:keyboard:来源: http://www.cnblogs.com/xingshansi/p/6477185.html