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中的数据类型
小学时候我们就知道,数学中有自然数.整数.分数.小数等等很多种类型的数.到了中学,我们又发现了其实还有无理数.复数这些有些特殊的数.到了大学学了高等数学之后,我们又知道了其实还存在着无穷大.无穷小这样 ...
随机推荐
- ARC和MRC混合模式下的编译问题
在一个支持ARC (Automatic Reference Counting)的项目中,有时候需要禁止其中几个文件使用ARC模式编译(比如你用了第三方不支持ARC的类库).这时就要点击工程文件,在ta ...
- MINST手写数字识别(一)—— 全连接网络
这是一个简单快速入门教程——用Keras搭建神经网络实现手写数字识别,它大部分基于Keras的源代码示例 minst_mlp.py. 1.安装依赖库 首先,你需要安装最近版本的Python,再加上一些 ...
- Linux部署多个tomcat
Linux部署多个tomcat 1.环境:1.1. Centos 5.01.2.Tomcat 5.5.17 2.需要解决一下几个问题2.1.不同的tomcat启动和关闭监听不同的端口2.2.不同的to ...
- shell脚本,锁机制
[root@localhost wyb]# cat suijizhi.sh #!/bin/bash a=`|grep -v grep |wc -l` echo "$a" [ $a ...
- 用vue 简单写的日历
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- fopen()和socket()的内在联系
int portone=socket(AF_INET,SOCK_STREAM, 0); printf("portone=%d",portone); printf("ope ...
- C++模板 · 为什么要引入模板机制?
刚学过类模板时,很不理解,甚至觉得这简直没有用,在自己骗自己嘛!明明很方便的东西,偏偏要加个类模板来回折腾.可能因为我们刚开始写的程序很简单,有时候,可能程序复杂一点,对理解一些概念更有帮助. 今天在 ...
- python 多线程 压测 mysql
#!/usr/bin/env python # encoding: utf-8 #@author: 东哥加油 #@file: sthread.py #@time: 2018/9/17 17:07 im ...
- 【Office_Word】Word排版
文档排版的步骤: step1.先设置正文的样式 step2.再设置各级标题的样式 step3.最后在"多级列表"里设置各级标题编号 [注]最好按照这三步的顺序来排版,否则将会导致正 ...
- grafana绘制图表
安装方法 系统为ubuntu16 1首先添加以下到/etc/apt/sources.list: deb https://packagecloud.io/grafana/stable/debian/ s ...