8.8 调试和剖析
8.8.2 调试器的使用
8.8.2.2 调试器应用示例
【 * 例 8.8.2 .2.-1 】本例的目标:对于任意随机向量,画出鲜明标志该随机向量均值、标准差的频数直方图(如图 8.8.2. 2-1-1 ),或给出绘制这种图形的数据。
图 8.8.2 . 2-1-1 带均值、标准差标志的频数直方图
(1)根据题目要求写出以下两个 M 文件
[histzzy.m]
function [nn,xx,xmu,xstd]=histzzy(x)
xmu=mean(x);
xstd=std(x);
[nn,xx]=hist(x);
if nargout==0
barzzy(nn,xx,xmu,xstd) %<6>
end
[barzzy.m]
function barzzy(nn,xx,xmu,xstd)
clf,
bar(xx,nn);hold on
Ylimit=get(gca, 'YLim' );
yy=0:Ylimit(2);
xxmu=xmu*size(yy);
xxL=xxmu/xmu*(xmu-xstd);
xxR=xxmu/xmu*(xmu+xstd);
plot(xxmu,yy, 'r' , 'Linewidth' ,3) %<9>
plot(xxL,yy, 'rx' , 'MarkerSize' ,8)
plot(xxR,yy, 'rx' , 'MarkerSize' ,8),hold off
(2)初次运行以下指令后,得到运行出错的提示。
randn('seed',1),x=randn(1,100);histzzy(x);
??? Error using ==> plot
Vectors must be the same lengths.
Error in ==> E:\mat53\work\barzzy.m
On line 8 ==> plot(xxmu,yy,'r','Linewidth',3)
Error in ==> E:\MAT53\work\histzzy.m
On line 6 ==> barzzy(nn,xx,xmu,xstd)
图 8.8.2 . 2-1-2 运行出错时所得的不完整图形
(3)初步分析错误原因
(4)断点设置
(5)在指令窗中运行以下指令,进入“动态”调试
randn('seed',1),x=randn(1,100);histzzy(x);
图 8.8.2 . 2-1-3 运行暂停在断点处
(6)深入被调文件内部
图 8.8.2 . 2-1-4 动态调试深入 barzzy.m
(7)连续执行,直到另一个断点
图 8.8.2 . 2-1-5 变量值的鼠标观察法
(8)指令窗观察法
(9)修改程序,停止第一论调试,重新运行。
randn('seed',1),x=randn(1,100);histzzy(x);
8.8.3 M文件性能剖析
8.8.3.2 剖析器
【 * 例 8.8.3 .2-1 】演示剖析指令的基本使用:对例 8.8.2.2-1 中那通过调试后运行正确的 histzzy.m 进行性能分析。
(1)产生剖析报告
randn('seed',1),x=randn(1,100);
profile on % 启动剖析器,在 mmex 层面上统计数据
for kk=1:100;histzzy(x);end % 运行 100 次,使统计数据受随机因素影响较小
profile report histzzy_report % 产生名为 histzzy_report.htm 的分析报告
图 8.8.3 . 2-1-1 超文本形式剖析报告的 Summary 章的部分内容