MATLAB(1)

前言
|
之前经常用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
|
keyboardP_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)enddisp(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))enddisp(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 VMDt=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 allclc;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文件第一个可执行语句前设断点; (2)断点清除: * dbclear all:清除所有M文件中的所有断点; (3)恢复运行: * dbcount:从断点处恢复程序的执行,直到下一个断点或错误后返回Matlab基本工作空间; (4)执行一行或多行语句: * dbstep:执行下一个可执行语句; |
MATLAB(1)的更多相关文章
- 《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)
http://www.matlabsky.com/thread-43937-1-1.html <量化投资:以MATLAB为工具>连载(3)基础篇-N分钟学会MATLAB(下) ...
- 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)
http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...
- 矩阵卷积Matlab(转载)
转载自:http://blog.csdn.net/anan1205/article/details/12313593 两个矩阵卷积转化为矩阵相乘形式--Matlab应用(这里考虑二维矩阵,在图像中对应 ...
- Newman的 power law 参数估计的程序matlab(转载)
转自:http://blog.sciencenet.cn/blog-4716-46173.html 对于幂率分布的估计问题是个很复杂的问题(..., the empirical detection a ...
- MATLAB(5)——生成归一化直方图
作者:桂. 时间:2017-03-10 22:13:36 链接:http://www.cnblogs.com/xingshansi/p/6533579.html 声明:欢迎转载,不过记得注明出处哦~ ...
- rand ----MATLAB (经典)
最近一直在学习matlab,我相信有一些同学已经发现,最近更新的关于matlab的内容比较多, 希望能够帮助到未来的小学弟学妹们! 永远爱你们的 ----新宝宝 rand 均匀分布的随机数全页折叠 语 ...
- PCA (主成分分析)详解 (写给初学者) 结合matlab(转载)
一.简介 PCA(Principal Components Analysis)即主成分分析,是图像处理中经常用到的降维方法,大家知道,我们在处理有关数字图像处理方面的问题时,比如经常用的图像的查询问题 ...
- MATLAB(3)——GUI界面设计入门
作者:桂. 时间:2017-03-01 18:43:35 链接:http://www.cnblogs.com/xingshansi/articles/6485688.html 声明:转载请注明出处, ...
- MATLAB(1)——基本调试方法(Debug)
作者:桂. 时间:2017-02-28 07:06:30 链接:http://www.cnblogs.com/xingshansi/articles/6477185.html 声明:转载请注明出处, ...
- $ 一步一步学Matlab(3)——Matlab中的数据类型
小学时候我们就知道,数学中有自然数.整数.分数.小数等等很多种类型的数.到了中学,我们又发现了其实还有无理数.复数这些有些特殊的数.到了大学学了高等数学之后,我们又知道了其实还存在着无穷大.无穷小这样 ...
随机推荐
- CAD交互绘制mcdbsolid对象(网页版)
主要用到函数说明: _DMxDrawX::DrawSolid 绘McDbSolid对象.详细说明如下: 参数 说明 DOUBLE dX1 第一个点X DOUBLE dY1 第一个点Y DOUBLE d ...
- Hermite 矩阵及其特征刻画
将学习到什么 矩阵 \(A\) 与 \(\dfrac{1}{2}(A+A^T)\) 两者生成相同的二次型,而后面那个矩阵是对称的,这样以来,为了研究实的或者复的二次型,就只需要研究由对称矩阵生成的二次 ...
- vs 2017 boost 安装目录 非安装
linuxg++ -Wall -std=c++11 boost_socks5.cpp -o boost_socks5 -lboost_system -lboost_thread -lpthread m ...
- syslog(),closelog()与openlog()--日志操作函数 (2)
文章出处:http://blog.chinaunix.net/uid-26583794-id-3166083.html 守护进程日志的实现 syslogd守护进程用于解决守护进程的日志记录问题,而日志 ...
- python-DB模块实例
MySQLdb其实有点像php或asp中连接数据库的一个模式了,只是MySQLdb是针对mysql连接了接口,我们可以在python中连接MySQLdb来实现数据的各种操作. python连接mysq ...
- bzoj5138 [Usaco2017 Dec]Push a Box
题目描述: bz luogu 题解: 暴力可以记录$AB$位置转移,这个时候状态是$n^4$的,无法接受. 考虑只记录$A$在$B$旁边时的状态,这个时候状态时$n^2$的. 所以说转移有两种,一种是 ...
- (10)zabbix item key详解
1. 灵活的参数 参数位置可用接收任意参数则是灵活的.例如vfs.fs.size[*],”*”星号可以使用任意的参数,例如:vfs.fs.size[/]vfs.fs.size[/opt] 2. Key ...
- tkinter学习-文本框
阅读目录 Entry 输入框 Text 文本框 Entry: 说明:输入控件,用于显示简单的文本内容 属性:在输入框中用代码添加和删除内容,同样也是用insert()和delete()方法 from ...
- js获取移动端触摸坐标
想在touchmove事件里监听手指按下的坐标,event.pageX获取的是undefined,changedTouches,targetTouches,touches也只获得到了鼠标按下时的坐标, ...
- CSS3中制作倒影box-reflect
目前仅在Chrome.Safari和Opera浏览器下支持 box-reflect:none | <direction> <offset>? <mask-box-imag ...