实验六M文件和面向对象编程.docx
- 文档编号:3455171
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:35
- 大小:383.48KB
实验六M文件和面向对象编程.docx
《实验六M文件和面向对象编程.docx》由会员分享,可在线阅读,更多相关《实验六M文件和面向对象编程.docx(35页珍藏版)》请在冰豆网上搜索。
实验六M文件和面向对象编程
实验六M文件和面向对象编程
假如读者想灵活运用MATLAB去解决实际问题,想充分调动MATLAB——科学技术资源,想理解MATLAB版本升级所依仗的基础,那么本章内容将十分有用。
本章将涉及比较深层的MATLAB内容:
脚本;函数(一般函数、内联函数、子函数、私用函数、方法函数);函数句柄的创建和使用;程序调试和剖析;数据结构(类、对象);重载和继承;面向对象编程。
本章配备了许多精心设计的算例。
这些算例是完整的,可直接演练的。
读者通过这些算例,将真切感受到抽象概念的内涵、各指令间的协调,将从感知上领悟到面向对象编程的优越和至关要领。
本章新增了第7.7节,专门阐述函数句柄的创建和使用,它适用于MATLAB6.x版;而新增的第7.9.3节中关于程序性能优化的内容,则仅适用于MATLAB6.5以后版。
7.1入门
【例7.1-1】通过M脚本文件,画出下列分段函数所表示的曲面。
(1)
图7.1-1
[exm0701_1.m]
%exm0701_1.m
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);
(2)
exm0701_1
图7.1-2
【例7.1-2】通过M函数文件画出上例分段函数的曲面。
exm0701_2(2,2)
7.2M文本编辑器
7.3MATLAB控制流
7.3.1for循环结构
【例7.3.1-1】一个简单的for循环示例。
fori=1:
10;
x(i)=i;
end;
x
x=
12345678910
7.3.2while循环结构
【例7.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);
i=i+1;
end;
i,a(i),
i=
21
ans=
10946
7.3.3if-else-end分支结构
【例7.3.3-1】一个简单的分支结构。
cost=10;number=12;
ifnumber>8
sums=number*0.95*cost;
end,sums
sums=
114.0000
【例7.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
7.3.4switch-case结构
【例7.3.4-1】学生的成绩管理,用来演示switch结构的应用。
clear;
%
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);
%
S=struct('Name',Name,'Marks',Mark,'Rank',Rank);
%
fori=1:
5
switchS(i).Marks
case100
S(i).Rank='满分';
casea
S(i).Rank='优秀';
caseb
S(i).Rank='良好';
casec
S(i).Rank='及格';
otherwise
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满分
7.3.5try-catch结构
【例7.3.5-1】try-catch结构应用实例:
对
魔方阵的行进行援引,当“行下标”超出魔方阵的最大行数时,将改向对最后一行的援引,并显示“出错”警告。
clear,N=4;A=magic(3);
try
A_N=A(N,:
)
catch
A_end=A(end,:
)
end
lasterr
A_end=
492
ans=
Indexexceedsmatrixdimensions.
7.3.6控制程序流的其它常用指令
7.3.6.1return指令
7.3.6.2input和keyboard指令
7.3.6.3yesinput指令
7.3.6.4pause指令
7.3.6.5break指令
7.3.6.6error和warning指令
7.4脚本文件和函数文件
7.4.1M脚本文件
7.4.2M函数文件
7.4.3局部变量和全局变量
7.4.4M文件的一般结构
【例7.4.4-1】M函数文件示例。
本例演示:
(A)编写一个画任意半径任意色彩线型的圆。
(B)完整函数文件的基本结构。
(C)函数文件各基本组成部分的作用。
[exm07044_1.m]
functionsa=exm07044_1(r,s)
%CIRCLE
%
%
%
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')
7.4.5P码文件
7.4.5.1语法分析过程和伪代码
7.4.5.2P码文件的预生成
7.4.5.3内存中P码文件的列表和清除
7.4.6MATLAB的搜索过程
7.5变量的检测传递和限权使用函数
7.5.1输入输出宗量检测指令
7.5.2“变长度”输入输出宗量
【例7.5.2-1】变长度宗量使用示例。
(1)
[exm07052_1.m]
functionvarargout=exm07052_1(r,varargin)
%RINGZYPlotaringandcalculatetheareaofthering.
%
%
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)
r1=1;r2=3;
[x1,y1,x2,y2,s1,s2]=exm07052_1(r1);
[x1,y1,x2,y2]=exm07052_1(r1,r2);
[x1,y1,x2,y2,s1,s2]=exm07052_1(r1,r2);
(3)
r1=1;r2=0.6;
subplot(1,3,1),exm07052_1(r1,r2),
subplot(1,3,2),exm07052_1(r1,r2,'Marker','o')
subplot(1,3,3),exm07052_1(r1,r2,'LineWidth',5,'Color',[10.40])
图7.5-1
7.5.3跨空间变量传递
7.5.3.1跨空间计算串表达式的值
【例7.5.3.1-1】本例演示:
(A)编写绘制正多边形或圆的程序。
(B)子函数与(母)函数的关系。
(C)各种不同的工作空间。
(D)evalin运行机理与eval的异同。
(1)
[exm070531_1.m]
functiony1=exm070531_1(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)
clear,a=30;t=(0:
a)/a*2*pi;sss={'base','caller','self'};
fork=1:
3
y0=exm070531_1(8,sss{k});
subplot(1,3,k)
plot(real(y0),imag(y0),'r','LineWidth',3),axissquareimage
end
图7.5-2
7.5.3.2跨空间赋值
【例7.5.3.2-1】assignin运作机理示范。
(1)
[exm070532_1.m]
functiony=exm070532_1(x)
y=sqrt(x);t=x^2;
assignin('base','yy',t)
(2)
clear;x=4;y=exm070532_1(x);
disp([blanks(5),'x',blanks(5),'y',blanks(4),'yy']),disp([x,y,yy])
xyyy
4216
7.5.4子函数和私用函数
7.5.4.1子函数
7.5.4.2私用函数
7.6串演算函数
7.6.1eval
【例7.6.1-1】计算“表达式”串,产生向量值。
clear,t=pi;cem='[t/2,t*2,sin(t)]';y=eval(cem)
y=
1.57086.28320.0000
【例7.6.1-2】计算“语句”串,创建变量。
clear,t=pi;eval('theta=t/2,y=sin(theta)');who
theta=
1.5708
y=
1
Yourvariablesare:
tthetay
【例7.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.
【例7.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
7.6.2feval
【例7.6.2-1】feval和eval运行区别之一:
feval的FN绝对不能是表达式。
x=pi/4;Ve=eval('1+sin(x)')
Ve=
1.7071
Vf=feval('1+sin(x)',x)
?
?
?
Errorusing==>feval
Invalidfunctionname'1+sin(x)'.
【例7.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.9193-0.39361.22120-0.7897-0.6135
-0.39360.919300.2633-0.61350.7897
Resultsbyfeval
-0.9193-0.39361.22120-0.7897-0.6135
-0.39360.919300.2633-0.61350.7897
7.6.3内联函数
7.6.3.1内联函数的创建
7.6.3.2涉及内联函数性质的指令
7.6.3.3内联函数创建和应用示例
【例7.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
【例7.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
【例7.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
【例7.6.3.3-4】演示:
最简练格式创建内联函数;内联函数可被feval指令调用。
Z2=inline('P1*x*sin(x^2+P2)',2)
Z2=
Inlinefunction:
Z2(x,P1,P2)=P1*x*sin(x^2+P2)
z2=Z2(2,2,3)
fz2=feval(Z2,2,2,3)
z2=
2.6279
fz2=
2.6279
7.7函数句柄
7.7.1函数句柄的创建和观察
【例7.7.1-1】为MATLAB的“内建”函数创建函数句柄,并观察其内涵。
(1)
hsin=@sin;
(2)
class(hsin)
size(hsin)
ans=
function_handle
ans=
11
(3)
CC=functions(hsin)
CC=
function:
'sin'
type:
'overloaded'
file:
'MATLABbuilt-infunction'
methods:
[1x1struct]
(4)
CC.methods.sym
ans=
d:
\matlab6p5\toolbox\symbolic\@sym\sin
7.7.2函数句柄的基本用法
【例7.7.2-1】本例通过函数及其句柄演示若干基本用法。
(1)
fhandle=str2func('sin');
(2)
ys=sin(pi/4)
yfold=feval('sin',pi/4)
yfnew=feval(fhandle,pi/4)
ys=
0.7071
yfold=
0.7071
yfnew=
0.7071
(3)
Alpha=sym('pi/4');
yss=sin(Alpha)
yfold=feval('sin',Alpha)
ynews=feval('sin',Alpha)
yss=
1/2*2^(1/2)
yfold=
1/2*2^(1/2)
ynews=
1/2*2^(1/2)
(4)
xold=fminbnd('sin',0,2*pi)
xnew=fminbnd(fhandle,0,2*pi)
xold=
4.7124
xnew=
4.7124
【例7.7.2-2】本例演示:
如何避免创建“无效函数句柄“问题。
(1)
Hy2=@fhzzy%fhzzy.m是随书光盘mfiles文件夹上的一个函数文件。
Hy2=
@fhzzy
(2)
class(Hy2)
size(Hy2)
ans=
function_handle
ans=
11
(3)
feval(Hy2,'line');
?
?
?
Errorusing==>feval
Undefinedfunction'fhzzy'.
【例7.7.2-3】自建函数及其句柄的使用。
(1)
[fhzzy.m]
functionHr=fhzzy(flag)
%fhzzy
%
%
t=(0:
100)/100*2*pi;
x=sin(t);
y=cos(t);
Hr=@cirline;
feval(Hr,flag,x,y,t)
%-------------subfunction---------------------------
functioncirline(wd,x,y,t)
%
%
switchwd
case'line'
plot(t,x,'b',t,y,'r','LineWidth',2)
case'circle'
plot(x,y,'g.','MarkerSize',30),
axissquareoff
otherwise
error('输入宗量只能取''line''或''circle''!
')
end
shg
(2)
Hy3=@fhzzy
fhzzy('line');
Hy3=
@fhzzy
图7.7-1
(3)
which('fhzzy')
fhzzynotfound.
(4)
fhzzy('line')
feval('fhzzy','line')
?
?
?
Undefinedfunctionorvariable'fhzzy'.
(5)
feval(Hy3,'line');
【例7.7.2-4】子函数句柄的创建与使用。
(1)
HCL=fhzzy('circle')
HCL=
@cirline
图7.7-2
(2)
tt=(0:
100)/100*2*pi;
xx=sin(tt);
yy=cos(tt);
cirline('circle',xx,yy,tt);
feval('circle',xx,yy,tt)
?
?
?
Undefinedfunctionorvariable'cirline'.
(3)
feval(HCL,'circle',xx,yy,tt)
7.8创建用户工具箱
7.8.1MATLAB对工具箱文件的管理特点
7.8.2建立用户工具箱须知
7.9调试和剖析
7.9.1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验六 M文件和面向对象编程 实验 文件 和面 对象 编程