在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
作者:桂。 时间:2017-02-28 07:06:30 链接:http://www.cnblogs.com/xingshansi/articles/6477185.html 声明:转载请注明出处,谢谢。
前言
一、代码内调试 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指令,即可绘制对应图形: 是不是也算方便? 二、断点调试方法 调试代码最经典的就是利用设置断点的方法,此处给出对应快捷键:
三、指令调试方法 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用于检查错误,如 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:
参考: 断点调试:http://fouvy.info/post/24542809639/matlab%E4%BB%A3%E7%A0%81%E8%B0%83%E8%AF%95%E6%8A%80%E5%B7%A7
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论