链接:http://www.cnblogs.com/xingshansi/articles/6477185.html
前言
之前经常用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 = max ( eig (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 = max ( eig (G'* pinv (F)*G) );
return ;
|
即可保证程序顺利执行。
B-try + (catch) +end
我们知道,matlab的代码是按行执行的,如果碰到错误行,则程序中断。try..catch可以使得可能出错的代码不影响后面代码的继续执行,也可以检查,排查,解决程序的一些错误,增强代码的鲁棒性和可靠性。
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用于检查错误,如
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
在程序执行前输入:
如果运行出现错误,matlab会自动停在出错的那行,并且保存所有相关变量。真心好用。
在.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));
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:停止
调试完成,需要清除所有断点:
在Command Windows输入:
在Command Windows输入:
-
其他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:执行函数剩余部分,离开函数时停止;
* 注:这四种都返回调试模式,如遇断点,中止;
参考:
|
链接:http://www.cnblogs.com/xingshansi/articles/6477185.html
前言
之前经常用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 = max ( eig (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 = max ( eig (G'* pinv (F)*G) );
return ;
|
即可保证程序顺利执行。
B-try + (catch) +end
我们知道,matlab的代码是按行执行的,如果碰到错误行,则程序中断。try..catch可以使得可能出错的代码不影响后面代码的继续执行,也可以检查,排查,解决程序的一些错误,增强代码的鲁棒性和可靠性。
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用于检查错误,如
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
在程序执行前输入:
如果运行出现错误,matlab会自动停在出错的那行,并且保存所有相关变量。真心好用。
在.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));
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:停止
调试完成,需要清除所有断点:
在Command Windows输入:
在Command Windows输入:
-
其他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:执行函数剩余部分,离开函数时停止;
* 注:这四种都返回调试模式,如遇断点,中止;
参考:
|
|
请发表评论