Matlab 第七次课.docx
- 文档编号:20138079
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:10
- 大小:29.12KB
Matlab 第七次课.docx
《Matlab 第七次课.docx》由会员分享,可在线阅读,更多相关《Matlab 第七次课.docx(10页珍藏版)》请在冰豆网上搜索。
Matlab第七次课
Matlab第七次课
p80,实验2。
functionresult=grade(x)
if(x>=0&x<=100)
if(x>=90)
result='A';
elseif(x>=80)
result='B';
elseif(x>=70)
result='C';
elseif(x>=60)
result='D';
else
result='E'
end
else
result='IllegalInput';
end
一些程序设计中的辅助函数
1、执行函数
(1)串演算函数eval
它对字符串表达式进行计算,其基本格式为:
eval(‘string’):
执行字符串指定的动作。
:
计算具有参数
的函数,并把结果返回给
。
例:
t=pi;
>>eval('theta=t/2,y=sin(theta)');
theta=
1.5708
y=
1
例:
>>cem={'sin','cos','tan'};
fork=1:
3
theta=pi*k/12;
y(1,k)=eval([cem{k},'(',num2str(theta),')',]);%num2str:
将数字转化为字符
end
>>y
y=
0.25880.86601.0000
例:
x=1:
.13:
pi;
>>y=sin(x);
>>subplot(2,1,1)
>>eval('plot(y)')
>>subplot(2,1,2);
>>eval('plot(tan(x))')
(2)串演算函数feval
将函数的字符串名传递给一个函数计算,其基本格式为:
:
计算F关于参数
的值,其中F为函数名或函数句柄。
例:
a=rand
(2);
>>heig=@sin;
>>d=feval(heig,a)
d=
0.81350.5703
0.22910.4671
2、时间运行函数
>>tic
>>inv(rand(300));
>>toc
程序的调试(Debug)与优化
一、程序的两类错误
1、语法错误(syntaxerrors)
一般有函数参数类型有误,矩阵阶数不符,括号省略等,在程序运行时会显示错误信息,以及错误所在的行数,所以很容易纠正这类错误。
例:
a=[1,3,4;8,9,4];
>>b=[2,7;6,5];
>>c=a*b
?
?
?
Errorusing==>mtimes
Innermatrixdimensionsmustagree.
2、运行错误(runtimeerrors)或逻辑错误
一般指在程序运行过程中,出现溢出或死循环,如除数为0等。
有时在程序运行时会显示错误信息,但有时Matlab会在执行完后产生不合理的结果,这个结果明显与预期值偏离,但此时所有函数的工作空间都已消失,因此不容易调试。
二、调试法
1、直接调试法
(1)通过分析后,将重点怀疑语句后的分号删掉,将结果显示在命令窗口,然后与预期值比较,从而找出错误地方。
(2)单独调试一个函数时,将第一行的函数声明行加上%,并定义输入变量的值,此时就可以用脚本文件的方式执行此文件,这样就可以把中间所有变量保存起来,找出错误。
例:
%functionf=fibonacci(n)
%FIBONACCI(n)generatesthefirstnFibonaccinumbers.
n=12;
f=zeros(n,1);
f
(1)=1
f
(2)=2
fork=3:
n
f(k)=f(k-1)+f(k-2)
end
(3)在程序中的适当位置添加keyboard指令,可使程序执行到此处暂停文件的执行,在提示符前显示”k>”,此时可以查看或改变工作空间的任何变量。
若要继续执行程序,可在命令窗口输入”return”并按enter键。
例:
functiontest()
r=input('Doyouwantmore?
Y/N:
','s');
ifisempty(r)
r='Y';
end
keyboard
ifr=='Y'
disp('youhaveselectedthefirstcharacter');
else
disp('youhaveselectedthesecondone');
end
2、工具调试法
(1)以命令行为主的程序调试
(i)设置断点
dbstopinfilename:
例:
functionz=buggy(x)
n=length(x);
z=(1:
n)./x
在命令窗口中输入:
>>dbstopinbuggy%在程序的可执行段的第一行设置断点
>>buggy(2:
5)
K>>return
z=
0.50000.66670.75000.8000
dbstopinfilenameatlinenumber:
在第linenumber行设置断点
例:
dbstopinbuggyat3
dbstopinfilenameatsubfun:
执行到该命令时,程序执行到子程序subfun时,暂时终止文件的执行.
dbstopiferror:
可在执行文件时,终止文件的执行,并使Matlab处于调试状态,运行停止在发生错误行,不能在错误后重新开始程序的执行。
例:
>>dbstopiferror
>>buggy(magic(3))
?
?
?
Errorusing==>rdivide
Matrixdimensionsmustagree.
Errorin==>buggyat3
z=(1:
n)./x
dbstopifwarning:
执行该命令后,在执行文件时遇到警告时,终止文件的执行,并使Matlab处于调试状态,运行停止在发生警告的行,程序可以恢复运行。
dbstopifnaninfordbstopifinfnan:
执行该命令后,当遇到非数值时,终止文件的执行
注:
注意查看workspace.
(ii)清除断点
Dbclearallinfilename:
清除所有文件中的所有断点
Dbclearinfilename:
清除文件filename中的第一个可执行语句的断点
Dbclearinfilenameatlinenumber:
清除文件filename中linenumber行的断点
Dbclearinfilenameatsubfun:
清除文件filename子函数subfun的断点
Dbcleariferror:
清除由dbstopiferror暂停的断点
Dbclearifwarning
Dbclearifnaninf
Dbclearifinfnan
(2)以图形界面为主的程序调试
在命令窗口输入editfilename,则进入调试器,此调试器包含了一系列调试图标(右上角右键EditorToolbar)。
要设立断点于函数中某一行,将光标置于该行并单击dbstop/dbclear图标,即可设定断点,此时该行之前会显示一红点,代表断点。
此时若在命令行输入函数,则可停于该断点,并以绿色向右的箭号显示所在的位置。
此时可以在命令行查看各个变量值。
若单击step标志则绿色箭号变成向下,再单击step标志,即可完成逐步执行。
例:
例:
计算向量的标准差(
)
functionf=strdv(x)
n=length(x);
s=sum(x);
y=s/n;
t=strdfun(x,y);
f=sqrt(t/(n-1));
functionf=strdfun(x,y)
t=0;
fori=1:
length(x)
t=t+(x-y).^2;
end
f=t;
在命令窗口中输入:
v=[1,3,5,7,9];
>>strdv(v)
ans=
4.47212.236102.23614.4721
这个结果显然是错误的,使用Matlab提供的内部函数std,计算结果如下:
>>std(v)
ans=
3.1623
对程序进行调试如下:
在程序最后一行设置断点,运行程序,当运行到断点处,断点和文本之间出现绿色箭头,在K>>后检查n,s,y,t,发现t有错误.
可以在workspace空间中双击变量,打开数组编辑器,查看和修改变量内容,可以判定断点以前部分是正确的,出错的是strdfun子函数,对子函数进行调试.切换工作空间到基本空间(把Stack换成Base),清除断点,绿色箭头变成白色,单击continue,使程序继续运行.
在子函数第五行设置断点,再一次调用函数strdv(v),查看变量值,发现问题t的计算上有问题,将t=t+(x-y).^2中x修改为x(i).
三、程序的优化
a)程序优劣的分析
Matlab的定时器profiler,它可以计算每一个命令所占用的执行时间,并列出详细的统计表。
例1
>>profileon%清除旧的计时数据,开始对各个函数进行计时。
fori=1:
1000
a=inv(rand(10));
b=mean(rand(10));
end
>>profilereport%停止定时器,将统计资料呈现出来。
>>
2、向量化,尽量少用循环语句
例1计算
。
方法1
>>tic
>>n=10000;
>>total=0;
>>fori=1:
n
total=total+1/i;
end
>>toc
Elapsedtimeis39.797000seconds.
方法2
>>tic
>>n=10000;
>>sequence=1:
n;
>>total=sum(1./sequence);
>>total
total=
1106/113
3、矩阵的预先配置
如果预先知道矩阵的维数大小,则可使用zeros,ones,cell,struct等可以给出矩阵的初始定义。
例2
>>h=zeros(6);
fori=1:
6
forj=1:
6
h(i,j)=1/(i+j-1);
end
end
若不预先配置矩阵,程序仍可执行,但需要动态增加或减少矩阵的大小,因此降低的程序的执行效率。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab 第七次课 第七
![提示](https://static.bdocx.com/images/bang_tan.gif)