Matlab 第七次课.docx

上传人:b****1 文档编号:20138079 上传时间:2023-04-25 格式:DOCX 页数:10 大小:29.12KB
下载 相关 举报
Matlab 第七次课.docx_第1页
第1页 / 共10页
Matlab 第七次课.docx_第2页
第2页 / 共10页
Matlab 第七次课.docx_第3页
第3页 / 共10页
Matlab 第七次课.docx_第4页
第4页 / 共10页
Matlab 第七次课.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

Matlab 第七次课.docx

《Matlab 第七次课.docx》由会员分享,可在线阅读,更多相关《Matlab 第七次课.docx(10页珍藏版)》请在冰豆网上搜索。

Matlab 第七次课.docx

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

若不预先配置矩阵,程序仍可执行,但需要动态增加或减少矩阵的大小,因此降低的程序的执行效率。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 小学教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1