matlab入门程序08.docx

上传人:b****2 文档编号:23128764 上传时间:2023-05-08 格式:DOCX 页数:37 大小:260.10KB
下载 相关 举报
matlab入门程序08.docx_第1页
第1页 / 共37页
matlab入门程序08.docx_第2页
第2页 / 共37页
matlab入门程序08.docx_第3页
第3页 / 共37页
matlab入门程序08.docx_第4页
第4页 / 共37页
matlab入门程序08.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

matlab入门程序08.docx

《matlab入门程序08.docx》由会员分享,可在线阅读,更多相关《matlab入门程序08.docx(37页珍藏版)》请在冰豆网上搜索。

matlab入门程序08.docx

matlab入门程序08

8M文件和面向对象编程

 

假如读者想灵活运用MATLAB去解决实际问题,想充分调动MATLAB——科学技术资源,想理解MATLAB版本升级所依仗的基础,那么本章内容将十分有用。

本章将涉及比较深层的MATLAB内容:

脚本;函数(一般函数、内联函数、子函数、私用函数、方法函数);程序调试和剖析;数据结构(类、对象);重载和继承;面向对象编程。

本章配备了许多精心设计的算例。

这些算例是完整的,可直接演练的。

读者通过这些算例,将真切感受到抽象概念的内涵、各指令间的协调,将从感知上领悟到面向对象编程的优越和至关要领。

8.1入门

【*例8.1-1】通过M脚本文件,画出下列分段函数所表示的曲面。

(1)编写M脚本文件的步骤

图8.1-1-1MATLABEditor/Debugger窗口

●点击MATLAB指令窗工具条上的NewFile图标

,就可打开如图8.1-1-1所示的MATLAB文件编辑调试器MATLABEditor/Debugger。

其窗口名为untitled,用户即可在空白窗口中编写程序。

比如输入如下一段程序

[zx81.m]

%zx81.mThisismyfirstexample.<1>

a=2;b=2;%<2>

clf;

x=-a:

0.2:

a;y=-b:

0.2:

b;

fori=1:

length(y)

forj=1:

length(x)

ifx(j)+y(i)>1

z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j));

elseifx(j)+y(i)<=-1

z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j));

elsez(i,j)=0.7575*exp(-y(i)^2-6.*x(j)^2);

end

end

end

axis([-a,a,-b,b,min(min(z)),max(max(z))]);

colormap(flipud(winter));surf(x,y,z);

●点击编辑调试器工具条图标

,在弹出的Windows标准风格的“保存为”对话框中,选择保存文件夹,键入新编文件名(如zx81),点动【保存】键,就完成了文件保存。

(2)运行文件

●使zx81.m所在目录成为当前目录,或让该目录处在MATLAB的搜索路径上

●然后运行以下指令,便可得到图形。

zx81

图8.1-1-2运行zx81.m得到的图形

 

【*例8.1-2】通过M函数文件画出上例分段函数的曲面。

整个编程步骤和相同。

在此演示,如何在zx81.m基础上产生函数文件zx82.m。

●在编辑调试器中,选择【File:

SaveAs】子菜单,把zx81.m文件“另存为”zx82.m。

●用下面4行指令代替原文件的第<1><2>条指令。

functionzx82(a,b)

%Thisismysecondexample.

%aDefinethelimitofvariablex.

%bDefinethelimitofvariabley.

●进行上述修改后,对zx82.m再次实施“保存”操作。

●在MATLAB指令窗中,运行以下指令,就能产生与图8.1-1-2完全相同的图形。

zx82(2,2)

8.2M文本编辑器

8.2.1利用文本编辑器编写M文件

8.2.2【tools】菜单

8.3MATLAB控制流

8.3.1for循环结构

【*例8.3.1-1】一个简单的for循环示例。

fori=1:

10;%i依次取1,2,…10,.

x(i)=i;%对每个i值,重复执行由该指令构成的循环体,

end;

x%要求显示运行后数组x的值。

x=

12345678910

 

8.3.2while循环结构

【*例8.3.2-1】Fibonacci数组的元素满足Fibonacci规则:

;且

现要求该数组中第一个大于10000的元素。

a

(1)=1;a

(2)=1;i=2;

whilea(i)<=10000

a(i+1)=a(i-1)+a(i);%当现有的元素仍小于10000时,求解下一个元素。

i=i+1;

end;

i,a(i),

i=

21

ans=

10946

 

8.3.3if-else-end分支结构

【*例8.3.3-1】一个简单的分支结构。

cost=10;number=12;

ifnumber>8

sums=number*0.95*cost;

end,sums

sums=

114.0000

 

【*例8.3.3-2】用for循环指令来寻求Fibonacc数组中第一个大于10000的元素。

n=100;a=ones(1,n);

fori=3:

n

a(i)=a(i-1)+a(i-2);

ifa(i)>=10000

a(i),

break;%跳出所在的一级循环。

end;

end,i

ans=

10946

i=

21

8.3.4switch-case结构

【*例8.3.4-1】学生的成绩管理,用来演示switch结构的应用。

clear;

%划分区域:

满分(100),优秀(90-99),良好(80-89),及格(60-79),不及格(<60)。

fori=1:

10;a{i}=89+i;b{i}=79+i;c{i}=69+i;d{i}=59+i;end;c=[d,c];

Name={'Jack','Marry','Peter','Rose','Tom'};%元胞数组

Mark={72,83,56,94,100};Rank=cell(1,5);

%创建一个含5个元素的构架数组S,它有三个域。

S=struct('Name',Name,'Marks',Mark,'Rank',Rank);

%根据学生的分数,求出相应的等级。

fori=1:

5

switchS(i).Marks

case100%得分为100时

S(i).Rank='满分';%列为'满分'等级

casea%得分在90和99之间

S(i).Rank='优秀';%列为'优秀'等级

caseb%得分在80和89之间

S(i).Rank='良好';%列为'良好'等级

casec%得分在60和79之间

S(i).Rank='及格';%列为'及格'等级

otherwise%得分低于60。

S(i).Rank='不及格';%列为'不及格'等级

end

end

%将学生姓名,得分,登记等信息打印出来。

disp(['学生姓名','得分','等级']);disp('')

fori=1:

5;

disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]);

end;

学生姓名得分等级

Jack72及格

Marry83良好

Peter56不及格

Rose94优秀

Tom100满分

 

8.3.5try-catch结构

【*例8.3.5-1】try-catch结构应用实例。

clear,N=4;A=magic(3);%设置3行3列矩阵A。

try

A_N=A(N,:

),%取A的第N行元素

catch

A_end=A(end,:

),%如果取A(N,:

)出错,则改取A的最后一行。

end

lasterr%显示出错原因

A_end=

492

ans=

Indexexceedsmatrixdimensions.

8.3.6控制程序流的其它常用指令

8.3.6.1return指令

8.3.6.2input和keyboard指令

8.3.6.3yesinput指令

8.3.6.4pause指令

8.3.6.5break指令

8.3.6.6error和warning指令

8.4脚本文件和函数文件

8.4.1M脚本文件

8.4.2M函数文件

8.4.3局部变量和全局变量

8.4.4M文件的一般结构

【*例8.4.4-1】M函数文件示例。

[circle.m]

functionsa=circle(r,s)

%CIRCLEplotacircleofradiirinthelinespecifiedbys.

%r指定半径的数值

%s指定线色的字符串

%sa圆面积

%

%circle(r)利用蓝实线画半径为r的圆周线.

%circle(r,s)利用串s指定的线色画半径为r的圆周线.

%sa=circle(r)计算圆面积,并画半径为r的蓝色圆面.

%sa=circle(r,s)计算圆面积,并画半径为r的s色圆面.

%编写于1999年4月7日,修改于1999年8月27日。

ifnargin>2

error('输入宗量太多。

');

end;

ifnargin==1

s='b';

end;

clf;

t=0:

pi/100:

2*pi;

x=r*exp(i*t);

ifnargout==0

plot(x,s);

else

sa=pi*r*r;

fill(real(x),imag(x),s)

end

axis('square')

 

8.4.5P码文件

8.4.5.1语法分析过程和伪代码

8.4.5.2P码文件的预生成

8.4.5.3内存中P码文件的列表和清除

8.4.6MATLAB的搜索过程

8.5变量的检测传递和限权使用函数

8.5.1输入输出宗量检测指令

8.5.2“变长度”输入输出宗量

【*例8.5.2-1】变长度宗量使用示例。

(1)编写函数文件ringzy.m

[ringzy.m]

functionvarargout=ringzy(r,varargin)

%RINGZYPlotaringandcalculatetheareaofthering.

%r基圆半径

%调用格式

%[x1,y1,x2,y2,s1,s2]=ringzy(r,r2,'PropertyName','PropertyValue',...)

%

(1)无输出时,绘圆或环。

%

(2)有输出时,不绘图。

%(x1,y1),(x2,y2)分别是两个圆的坐标点;

%s1是基圆面积;

%s2为正值时,表示内环面积;为负值时,表示外环面积。

vin=length(varargin);Nin=vin+1;%<11>

error(nargchk(1,Nin,nargin))%检查输入变量数目是否合适

ifnargout>6%检查输出变量数目是否合适

error('Toomanyoutputarguments')

end

t=0:

pi/20:

2*pi;x=r*exp(i*t);s=pi*r*r;

ifnargout==0

switchNin

case1

plot(x,'b')

case2

r2=varargin{1};%<22>

x2=r2*exp(i*t);

plot(x,'b');holdon;plot(x2,'b');holdoff

otherwise

r2=varargin{1};%<26>

x2=r2*exp(i*t);

plot(x,varargin{2:

end});holdon%利用元胞数组设置对象属性<28>

plot(x2,varargin{2:

end});holdoff%利用元胞数组设置对象属性<29>

end;

axis('square')

else

varargout{1}=real(x);varargout{2}=imag(x);%<33>

varargout{5}=pi*r*r;varargout{6}=[];%<34>

ifNin>1

r2=varargin{1};%<36>

x2=r2*exp(i*t);

varargout{3}=real(x2);varargout{4}=imag(x2);%<38>

varargout{6}=pi*(r^2-r2^2);%<39>

end;

end

 

(2)有输出情况:

请读者自己用plot(x1,y1,x2,y2)检验下列三个调用示例的运行结果。

r1=1;r2=3;

[x1,y1,x2,y2,s1,s2]=ringzy(r1);

[x1,y1,x2,y2]=ringzy(r1,r2);

[x1,y1,x2,y2,s1,s2]=ringzy(r1,r2);

 

(3)无输出情况:

为节省篇幅,在此给出三个调用示例。

r1=1;r2=0.6;

subplot(1,3,1),ringzy(r1,r2),

subplot(1,3,2),ringzy(r1,r2,'Marker','o')

subplot(1,3,3),ringzy(r1,r2,'LineWidth',5,'Color',[10.40])

图8.5.2-1-1变长度输入宗量不同调用格式产生的图形

 

8.5.3跨空间变量传递

8.5.3.1跨空间计算串表达式的值

【*例8.5.3.1-1】evalin运行机理与eval的异同。

(1)编写M函数文件

[evalinzzy.m]

functiony1=evalinzzy(a,s)

t=(0:

a)/a*2*pi;

y1=subevalinzzy(4,s);

%------------subfunction-------------

functiony2=subevalinzzy(a,s)

t=(0:

a)/a*2*pi;ss='a*exp(i*t)';

switchs

case{'base','caller'}

y2=evalin(s,ss);

case'self'

y2=eval(ss);

end

 

(2)在Notebook或MATLAB指令窗中运行以下指令

clear,a=30;t=(0:

a)/a*2*pi;sss={'base','caller','self'};

fork=1:

3

y0=evalinzzy(8,sss{k});

subplot(1,3,k)

plot(real(y0),imag(y0),'r','LineWidth',3),axissquareimage

end

图8.5.3.1-1利用不同工作空间中的变量值计算eval('a*exp(i*t)')

 

8.5.3.2跨空间赋值

【*例8.5.3.2-1】assignin运作机理示范。

(1)编写M函数文件

[assigninxyq.m]

functiony=assigninxyq(x)

y=sqrt(x);t=x^2;

assignin('base','yy',t)

 

(2)在Notebbok或MATLAB指令窗中运行以下指令

clear;x=4;y=assigninxyq(x);

disp([blanks(5),'x',blanks(5),'y',blanks(4),'yy']),disp([x,y,yy])

xyyy

4216

 

8.5.4子函数和私用函数

8.5.4.1子函数

8.5.4.2私用函数

8.6串演算函数

8.6.1eval

【*例8.6.1-1】计算“表达式”串,产生向量值。

clear,t=pi;cem='[t/2,t*2,sin(t)]';y=eval(cem)

y=

1.57086.28320.0000

 

【*例8.6.1-2】计算“语句”串,创建变量。

clear,t=pi;eval('theta=t/2,y=sin(theta)');who

theta=

1.5708

y=

1

Yourvariablesare:

tthetay

 

【*例8.6.1-3】计算“替代”串。

A=ones(2,1);B=ones(1,3);c=eval('B*A','A*B'),errmessage=lasterr

c=

111

111

errmessage=

Errorusing==>*

Innermatrixdimensionsmustagree.

 

【*例8.6.1-4】计算“合成”串。

CEM={'cos','sin','tan'};

fork=1:

3

theta=pi*k/12;

y(1,k)=eval([CEM{1},'(',num2str(theta),')']);

end

y

y=

0.96590.86600.7071

8.6.2feval

【例8.6.2-1】feval和eval运行区别之一:

feval的FN绝对不能是表达式。

x=pi/4;Ve=eval('1+sin(x)')

Ve=

1.7071

Vf=feval('1+sin(x)',x)

?

?

?

Cannotfindfunction'1+sin(x)'.

 

【*例8.6.2-2】feval和eval调用区别:

feval的FN只接受函数名。

本例两种方法以后者为好。

randn('seed',1);A=rand(2,2);

[ue,de,ve]=eval('svd(A)');

disp('Resultsbyeval');disp([ue,de,ve]);disp(blanks

(1))

[uf,df,vf]=feval('svd',A);

disp('Resultsbyfeval');disp([uf,df,vf])

Resultsbyeval

0.61800.78620.551600.46160.8871

0.7862-0.618000.30380.8871-0.4616

Resultsbyfeval

0.61800.78620.551600.46160.8871

0.7862-0.618000.30380.8871-0.4616

8.6.3内联函数

8.6.3.1内联函数的创建

8.6.3.2涉及内联函数性质的指令

8.6.3.3内联函数创建和应用示例

【*例8.6.3.3-1】演示:

内联函数的第一种创建格式;使内联函数适于“数组运算”。

clear,F1=inline('sin(rho)/rho')%第一种格式创建内联函数

F1=

Inlinefunction:

F1(rho)=sin(rho)/rho

f1=F1

(2)%内联函数的一种使用方法

f1=

0.4546

FF1=vectorize(F1)%产生适于“数组运算”的内联函数

xx=[0.5,1,1.5,2];ff1=FF1(xx)

FF1=

Inlinefunction:

FF1(rho)=sin(rho)./rho

ff1=

0.95890.84150.66500.4546

 

【*例8.6.3.3-2】演示:

第一种内联函数创建格式的缺陷;含向量的多宗量输入的赋值。

G1=inline('a*exp(x

(1))*cos(x

(2))'),G1(2,[-1,pi/3])

G1=

Inlinefunction:

G1(a)=a*exp(x

(1))*cos(x

(2))

_?

?

?

Errorusing==>inline/subsref

Toomanyinputstoinlinefunction.

G2=inline('a*exp(x

(1))*cos(x

(2))','a','x'),G2(2,[-1,pi/3])

G2=

Inlinefunction:

G2(a,x)=a*exp(x

(1))*cos(x

(2))

ans=

0.3679

 

【*例8.6.3.3-3】演示:

产生向量输入、向量输出的内联函数;这种向量函数的调用方法。

Y2=inline('[x

(1)^2;3*x

(1)*sin(x

(2))]')

argnames(Y2)%观察内联函数的输入宗量

Y2=

Inlinefunction:

Y2(x)=[x

(1)^2;3*x

(1)*sin(x

(2))]

ans=

'x'

x=[4,pi/6];%向量输入的赋值

y2=Y2(x)%获得向量输出

y2=

16.0000

6.0000

 

【*例8.6.3.3-4】演示:

最简练格式创建内联函数;内联函数可被feval指令调用。

Z2=inline('P1*x*sin(x^2+P2)',2)%必须是大写字母P

Z2=

Inlinefunction:

Z2(x,P1,P2)=P1*x*sin(x^2+P2)

z2=Z2(2,2,3)%直接计算内联函数

fz2=feval(Z2,2,2,3)%注意:

这里,应写Z2,不能写成'Z2'。

z2=

2.6279

fz2=

2.6279

8.7创建用户工具箱

8.7.1MATLAB对工具箱文件的管理特点

8.7.2建立用户工具箱须知

8.8调试和剖析

8.8.1直接调试法

8.8.2调试器的使用

8.8.2.1图形式调试器

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);

ifnargout=

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

当前位置:首页 > 农林牧渔 > 林学

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

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