《精通matlab65版 7 M文件和面向对象编程.pdf》由会员分享,可在线阅读,更多相关《精通matlab65版 7 M文件和面向对象编程.pdf(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 1 第七章第七章第七章第七章 M 文件和面向对象编程文件和面向对象编程文件和面向对象编程文件和面向对象编程 假如读者想灵活运用 MATLAB 去解决实际问题,想充分调动 MATLAB科学技术资源,想理解 MATLAB版本升级所依仗的基础,那么本章内容将十分有用。本章将涉及比较深层的 MATLAB内容:脚本;函数(一般函数、内联函数、子函数、私用函数、方法函数);函数句柄的创建和使用;程序调试和剖析;数据结构(类、对象);重载和继承;面向对象编程。本章配备了许多精心设计的算例。这些算例是完整的,可直接演练的。读者通过这些算例,将真切感受到抽象概念的内涵、各指令间的协调,将从感知上领悟到面向对象
2、编程的优越和至关要领。本章新增了第 7.7节,专门阐述函数句柄的创建和使用,它适用于 MATLAB6.x版;而新增的第 7.9.3节中关于程序性能优化的内容,则仅适用于 MATLAB6.5以后版。7.1 入门入门入门入门【例 7.1-1】通过 M脚本文件,画出下列分段函数所表示的曲面。+=+15457.0117575.015457.0),(215.175.375.0216215.175.375.02112122212212122xxexxexxexxpxxxxxxxx(1)图 7.1-1 exm0701_1.m%exm0701_1.m a=2;b=2;%clf;x=-a:0.2:a;y=-b:
3、0.2:b;for i=1:length(y)for j=1:length(x)if x(j)+y(i)1 z(i,j)=0.5457*exp(-0.75*y(i)2-3.75*x(j)2-1.5*x(j);elseif x(j)+y(i)=-1 z(i,j)=0.5457*exp(-0.75*y(i)2-3.75*x(j)2+1.5*x(j);2 else z(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)
4、;(2)exm0701_1 图 7.1-2 【例 7.1-2】通过 M函数文件画出上例分段函数的曲面。exm0701_2(2,2)7.2 M 文本编辑器文本编辑器文本编辑器文本编辑器 7.3 MATLAB 控制流控制流控制流控制流 7.3.1 for 循环结构循环结构循环结构循环结构【例 7.3.1-1】一个简单的 for循环示例。for i=1:10;x(i)=i;end;x x=1 2 3 4 5 6 7 8 9 10 7.3.2 while 循环结构循环结构循环结构循环结构【例 7.3.2-1】Fibonacci数组的元素满足 Fibonacci 规则:12+=kkkaaa,),2,1(
5、?=k;且121=aa。现要求该数组中第一个大于 10000的元素。a(1)=1;a(2)=1;i=2;while a(i)8 sums=number*0.95*cost;end,sums sums=114.0000 【例 7.3.3-2】用 for循环指令来寻求 Fibonacc数组中第一个大于 10000的元素。n=100;a=ones(1,n);for i=3:n a(i)=a(i-1)+a(i-2);if a(i)=10000 a(i),break;end;end,i ans=10946 i=21 7.3.4 switch-case 结构结构结构结构【例 7.3.4-1】学生的成绩管理
6、,用来演示 switch结构的应用。clear;%for i=1:10;ai=89+i;bi=79+i;ci=69+i;di=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);%for i=1:5 switch S(i).Marks case 100 S(i).Rank=满分满分满分满分;case a S(i).Rank=优秀优秀优秀优秀;case b S(i).Rank=良好良好良好良好;case
7、 c S(i).Rank=及格及格及格及格;otherwise S(i).Rank=不及格不及格不及格不及格;4 end end%disp(学生姓名学生姓名学生姓名学生姓名 ,得分得分得分得分 ,等级等级等级等级);disp()for i=1:5;disp(S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank);end;学生姓名 得分 等级 Jack 72 及格 Marry 83 良好 Peter 56 不及格 Rose 94 优秀 Tom 100 满分 7.3.5 try-catch 结构结构结构结构【例 7.3.5-1】tr
8、y-catch 结构应用实例:对)33(魔方阵的行进行援引,当“行下标”超出魔方阵的最大行数时,将改向对最后一行的援引,并显示“出错”警告。clear,N=4;A=magic(3);try A_N=A(N,:)catch A_end=A(end,:)end lasterr A_end=4 9 2 ans=Index exceeds matrix dimensions.7.3.6 控制程序流的其它常用指令控制程序流的其它常用指令控制程序流的其它常用指令控制程序流的其它常用指令 7.3.6.1 return 指令指令指令指令 7.3.6.2 input 和和和和 keyboard 指令指令指令指令
9、 7.3.6.3 yesinput 指令指令指令指令 7.3.6.4 pause 指令指令指令指令 7.3.6.5 break 指令指令指令指令 7.3.6.6 error 和和和和 warning 指令指令指令指令 7.4 脚本文件和函数文件脚本文件和函数文件脚本文件和函数文件脚本文件和函数文件 7.4.1 M 脚本文件脚本文件脚本文件脚本文件 5 7.4.2 M 函数文件函数文件函数文件函数文件 7.4.3 局部变量和全局变量局部变量和全局变量局部变量和全局变量局部变量和全局变量 7.4.4 M 文件的一般结构文件的一般结构文件的一般结构文件的一般结构【例 7.4.4-1】M函数文件示例。
10、本例演示:(A)编写一个画任意半径任意色彩线型的圆。(B)完整函数文件的基本结构。(C)函数文件各基本组成部分的作用。exm07044_1.m function sa=exm07044_1(r,s)%CIRCLE%if nargin2 error(输入宗量太多。);end;if nargin=1 s=b;end;clf;t=0:pi/100:2*pi;x=r*exp(i*t);if nargout=0 plot(x,s);else sa=pi*r*r;fill(real(x),imag(x),s)end axis(square)7.4.5 P 码文件码文件码文件码文件 7.4.5.1 语法分析
11、过程和伪代码语法分析过程和伪代码语法分析过程和伪代码语法分析过程和伪代码 7.4.5.2 P 码文件的预生成码文件的预生成码文件的预生成码文件的预生成 7.4.5.3 内存中内存中内存中内存中 P 码文件的列表和清除码文件的列表和清除码文件的列表和清除码文件的列表和清除 7.4.6 MATLAB 的搜索过程的搜索过程的搜索过程的搜索过程 7.5 变量的检测传递和限权使用函数变量的检测传递和限权使用函数变量的检测传递和限权使用函数变量的检测传递和限权使用函数 6 7.5.1 输入输出宗量检测指令输入输出宗量检测指令输入输出宗量检测指令输入输出宗量检测指令 7.5.2“变长度变长度变长度变长度”输
12、入输出宗量输入输出宗量输入输出宗量输入输出宗量【例 7.5.2-1】变长度宗量使用示例。(1)exm07052_1.m function varargout=exm07052_1(r,varargin)%RINGZY Plot a ring and calculate the area of the ring.%vin=length(varargin);Nin=vin+1;%error(nargchk(1,Nin,nargin)%if nargout6%error(Too many output arguments)end t=0:pi/20:2*pi;x=r*exp(i*t);s=pi*r*
13、r;if nargout=0 switch Nin case 1 plot(x,b)case 2 r2=varargin1;%x2=r2*exp(i*t);plot(x,b);hold on;plot(x2,b);hold off otherwise r2=varargin1;%x2=r2*exp(i*t);plot(x,varargin2:end);hold on%plot(x2,varargin2:end);hold off%end;axis(square)else varargout1=real(x);varargout2=imag(x);%varargout5=pi*r*r;varar
14、gout6=;%if Nin1 r2=varargin1;%x2=r2*exp(i*t);varargout3=real(x2);varargout4=imag(x2);%varargout6=pi*(r2-r22);%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),7 subplot(1,3,2),exm07
15、052_1(r1,r2,Marker,o)subplot(1,3,3),exm07052_1(r1,r2,LineWidth,5,Color,1 0.4 0)-101-1-0.500.51-101-1-0.500.51-101-1-0.500.51 图 7.5-1 7.5.3 跨空间变量传递跨空间变量传递跨空间变量传递跨空间变量传递 7.5.3.1 跨空间计算串表达式的值跨空间计算串表达式的值跨空间计算串表达式的值跨空间计算串表达式的值【例 7.5.3.1-1】本例演示:(A)编写绘制正多边形或圆的程序。(B)子函数与(母)函数的关系。(C)各种不同的工作空间。(D)evalin运行机理与 e
16、val的异同。(1)exm070531_1.m function y1=exm070531_1(a,s)t=(0:a)/a*2*pi;y1=subevalinzzy(4,s);%-subfunction -function y2=subevalinzzy(a,s)t=(0:a)/a*2*pi;ss=a*exp(i*t);switch s 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;for k=1:3 y0=exm07053
17、1_1(8,sssk);subplot(1,3,k)plot(real(y0),imag(y0),r,LineWidth,3),axis square image end 8-20020-20-1001020-505-505-4-2024-4-2024 图 7.5-2 7.5.3.2 跨空间赋值跨空间赋值跨空间赋值跨空间赋值【例 7.5.3.2-1】assignin运作机理示范。(1)exm070532_1.m function y=exm070532_1(x)y=sqrt(x);t=x2;assignin(base,yy,t)(2)clear;x=4;y=exm070532_1(x);dis
18、p(blanks(5),x,blanks(5),y,blanks(4),yy),disp(x,y,yy)x y yy 4 2 16 7.5.4 子函数和私用函数子函数和私用函数子函数和私用函数子函数和私用函数 7.5.4.1 子函数子函数子函数子函数 7.5.4.2 私用函数私用函数私用函数私用函数 7.6 串演算函数串演算函数串演算函数串演算函数 7.6.1 eval【例 7.6.1-1】计算“表达式”串,产生向量值。clear,t=pi;cem=t/2,t*2,sin(t);y=eval(cem)y=1.5708 6.2832 0.0000 【例 7.6.1-2】计算“语句”串,创建变量。
19、clear,t=pi;eval(theta=t/2,y=sin(theta);who theta=1.5708 y=1 9 Your variables are:t theta y 【例 7.6.1-3】计算“替代”串。A=ones(2,1);B=ones(1,3);c=eval(B*A,A*B),errmessage=lasterr c=1 1 1 1 1 1 errmessage=Error using=*Inner matrix dimensions must agree.【例 7.6.1-4】计算“合成”串。CEM=cos,sin,tan;for k=1:3 theta=pi*k/12
20、;y(1,k)=eval(CEM1,(,num2str(theta),);end y y=0.9659 0.8660 0.7071 7.6.2 feval【例 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)?Error using=feval Invalid function name 1+sin(x).【例 7.6.2-2】feval 和 eval 调用区别:feval 的 FN只接受函数名。本例两种方法以后者为好。randn(seed,1)
21、;A=rand(2,2);ue,de,ve=eval(svd(A);disp(Results by eval);disp(ue,de,ve);disp(blanks(1)uf,df,vf=feval(svd,A);disp(Results by feval);disp(uf,df,vf)Results by eval -0.9193 -0.3936 1.2212 0 -0.7897 -0.6135 -0.3936 0.9193 0 0.2633 -0.6135 0.7897 Results by feval -0.9193 -0.3936 1.2212 0 -0.7897 -0.6135 -0
22、.3936 0.9193 0 0.2633 -0.6135 0.7897 7.6.3 内联函数内联函数内联函数内联函数 7.6.3.1 内联函数的创建内联函数的创建内联函数的创建内联函数的创建 7.6.3.2 涉及内联函数性质的指令涉及内联函数性质的指令涉及内联函数性质的指令涉及内联函数性质的指令 10 7.6.3.3 内联函数创建和应用示例内联函数创建和应用示例内联函数创建和应用示例内联函数创建和应用示例【例 7.6.3.3-1】演示:内联函数的第一种创建格式;使内联函数适于“数组运算”。clear,F1=inline(sin(rho)/rho)F1=Inline function:F1(r
23、ho)=sin(rho)/rho f1=F1(2)f1=0.4546 FF1=vectorize(F1)xx=0.5,1,1.5,2;ff1=FF1(xx)FF1=Inline function:FF1(rho)=sin(rho)./rho ff1=0.9589 0.8415 0.6650 0.4546 【例 7.6.3.3-2】演示:第一种内联函数创建格式的缺陷;含向量的多宗量输入的赋值。G1=inline(a*exp(x(1)*cos(x(2),G1(2,-1,pi/3)G1=Inline function:G1(a)=a*exp(x(1)*cos(x(2)?Error using=inl
24、ine/subsref Too many inputs to inline function.G2=inline(a*exp(x(1)*cos(x(2),a,x),G2(2,-1,pi/3)G2=Inline function: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=Inline function:Y2(x)=x(1)2;3*x(1)*sin(x(2)ans=x x=4,pi/6
25、;y2=Y2(x)y2=16.0000 6.0000 【例 7.6.3.3-4】演示:最简练格式创建内联函数;内联函数可被 feval 指令调用。Z2=inline(P1*x*sin(x2+P2),2)Z2=Inline function:Z2(x,P1,P2)=P1*x*sin(x2+P2)z2=Z2(2,2,3)fz2=feval(Z2,2,2,3)z2=2.6279 fz2=2.6279 11 7.7 函数句柄函数句柄函数句柄函数句柄 7.7.1 函数句柄的创建和观察函数句柄的创建和观察函数句柄的创建和观察函数句柄的创建和观察【例 7.7.1-1】为 MATLAB的“内建”函数创建函数句
26、柄,并观察其内涵。(1)hsin=sin;(2)class(hsin)size(hsin)ans=function_handle ans=1 1 (3)CC=functions(hsin)CC=function:sin type:overloaded file:MATLAB built-in function methods:1x1 struct (4)CC.methods.sym ans=d:matlab6p5toolboxsymbolicsymsin 7.7.2 函数句柄的基本用法函数句柄的基本用法函数句柄的基本用法函数句柄的基本用法【例 7.7.2-1】本例通过函数及其句柄演示若干基本用
27、法。(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)12 (4)xold=fminbnd(sin,0,2*pi)xnew=fminbnd(fhandle,0,
28、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=1 1 (3)feval(Hy2,line);?Error using=feval Undefined function fhzzy.【例 7.7.2-3】自建函数及其句柄的使
29、用。(1)fhzzy.m function Hr=fhzzy(flag)%fhzzy%t=(0:100)/100*2*pi;x=sin(t);y=cos(t);Hr=cirline;feval(Hr,flag,x,y,t)%-subfunction-function cirline(wd,x,y,t)%switch wd case line plot(t,x,b,t,y,r,LineWidth,2)case circle plot(x,y,g.,MarkerSize,30),axis square off otherwise error(输入宗量只能取 line 或 circle!)end s
30、hg 13 (2)Hy3=fhzzy fhzzy(line);Hy3=fhzzy 01234567-1-0.8-0.6-0.4-0.200.20.40.60.81 图 7.7-1 (3)which(fhzzy)fhzzy not found.(4)fhzzy(line)feval(fhzzy,line)?Undefined function or variable fhzzy.(5)feval(Hy3,line);【例 7.7.2-4】子函数句柄的创建与使用。(1)HCL=fhzzy(circle)HCL=cirline 图 7.7-2 (2)14 tt=(0:100)/100*2*pi;xx
31、=sin(tt);yy=cos(tt);cirline(circle,xx,yy,tt);feval(circle,xx,yy,tt)?Undefined function or variable cirline.(3)feval(HCL,circle,xx,yy,tt)7.8 创建用户工具箱创建用户工具箱创建用户工具箱创建用户工具箱 7.8.1 MATLAB 对工具箱文件的管理特点对工具箱文件的管理特点对工具箱文件的管理特点对工具箱文件的管理特点 7.8.2 建立用户工具箱须知建立用户工具箱须知建立用户工具箱须知建立用户工具箱须知 7.9 调试和剖析调试和剖析调试和剖析调试和剖析 7.9.1
32、 直接调试法直接调试法直接调试法直接调试法 7.9.2 调试器的使用调试器的使用调试器的使用调试器的使用 7.9.2.1 图形式调试器图形式调试器图形式调试器图形式调试器 图 7.9-1 7.9.2.2 调试器应用示例调试器应用示例调试器应用示例调试器应用示例【例 7.9.2.2.-1】本例的目标:对于任意随机向量,画出鲜明标志该随机向量均值、标准差的频数直方图(如图 7.9-2),或给出绘制这种图形的数据。-3-2-101230510152025 图 7.9-2 15(1)exm070922_1.m function nn,xx,xmu,xstd=exm070922_1(x)%xmu=mea
33、n(x);xstd=std(x);nn,xx=hist(x);if nargout=0 barzzy0(nn,xx,xmu,xstd)%end barzzy0.m function barzzy0(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)%plot(xxL,yy,rx,MarkerSize,8)plot
34、(xxR,yy,rx,MarkerSize,8),hold off (2)randn(seed,1),x=randn(1,100);exm070922_1(x);?Error using=plot Vectors must be the same lengths.Error in=D:Master6mfilebarzzy0.m On line 11 =plot(xxmu,yy,r,Linewidth,3)%Error in=D:Master6mfileexm070922_1.m On line 7 =barzzy0(nn,xx,xmu,xstd)%-3-2-10123051 01 52 02
35、5 图7.9-3 (3)(4)(5)16 randn(seed,1),x=randn(1,100);exm070922_1(x);图 7.9-3 图 7.9-4 (7)图 7.9-5 (9)17 randn(seed,1),x=randn(1,100);exm070922_1(x);7.9.3 MATLAB 程序的性能优化程序的性能优化程序的性能优化程序的性能优化 7.9.3.1 提高提高提高提高 MATLAB 运行速度的有效措施运行速度的有效措施运行速度的有效措施运行速度的有效措施 7.9.3.2 JIT 和加速器的加速能力和加速器的加速能力和加速器的加速能力和加速器的加速能力【例 7.9.
36、3.2-1】试验 JIT和加速器对 M文件的加速作用。7.9.3.3 程序性能的剖析程序性能的剖析程序性能的剖析程序性能的剖析【例7.9.3.3-1】演示界面式剖析器的使用。本例被剖析文件relaxzzy.m可从随书光盘的 mfiles目录上得到。(1)图 7.9-6 (2)方法一:方法二:(3)18 图 7.9-7 19 图 7.9-8 7.10 面向对象编程面向对象编程面向对象编程面向对象编程 7.10.1 概念综述概念综述概念综述概念综述 7.10.1.1 类和对象类和对象类和对象类和对象 7.10.1.2 面向对象编程的内涵面向对象编程的内涵面向对象编程的内涵面向对象编程的内涵 20(
37、1)创建类目录创建类目录创建类目录创建类目录(2)选定待建类的数据结构选定待建类的数据结构选定待建类的数据结构选定待建类的数据结构(3)对象构造函数对象构造函数对象构造函数对象构造函数(4)显示函数显示函数显示函数显示函数(5)与其他类之间的转换函数与其他类之间的转换函数与其他类之间的转换函数与其他类之间的转换函数(6)其他重载函数和重载运算其他重载函数和重载运算其他重载函数和重载运算其他重载函数和重载运算 7.10.2 面向对象编程应用示例面向对象编程应用示例面向对象编程应用示例面向对象编程应用示例【例 7.10.2-1】本例演示:创建“先进先出”FIFO队列 queue类的全过程。在本例中
38、,读者应充分注意:构架域(Fields of a structure array)和定义在其上的方法函数(Method function)之间的关系。(1)(2)(3)queuequeue.m function q=queue(v)%QUEUEQUEUE%调用格式%superiorto(double,sparse,struct,cell,char,inline,sym);%if nargin1;error(Too many arguments.);end;if nargin=0%q.value=;q.name=;q=class(q,queue);elseif isa(v,queue);%q=v
39、;%else%q.value=v;%q.name=inputname(1);if isempty(q.name)q.name=(class(v);end q=class(q,queue);%end (4)queuedisplay.m function display(q,ki,kj)%QUEUEDISPLAY%调用格式%if nargin=0;error(缺少输入宗量,即被显示对象!);end switch nargin 21 case 1 m,n=size(q);vname=inputname(1);if isempty(vname)fprintf(ans=n);elseif fprintf
40、(%s=n,vname);end;if isempty(q)fprintf(empty )%fprintf(%s,class(q)%fprintf(nn);%elseif m*n=1;fprintf(%s:,q.name);disp(q.value);fprintf(n);else fprintf(%d*%d,m,n%fprintf(%s,class(q)%fprintf(nn);%end case 2 disp(The content of,inputname(1),(,int2str(ki),)disp(is a,class(q(ki).value),object)fprintf(%s=n
41、,q(ki).name);disp(q(ki).value);fprintf(n);case 3 disp(The content of,inputname(1),(,int2str(ki),int2str(kj),)disp(is a,class(q(ki,kj).value),object)fprintf(%s=n,q(ki,kj).name);disp(q(ki,kj).value);fprintf(n);end (5)queueisempty.m function f=isempty(q)%QUEUEISEMPTY f=0;m,n=size(q);if m*n=1;if isempty
42、(q.value)&isempty(q.name)%f=1;end;end;(6)queuecomein.m function q=comein(p,varargin)%QUEUECOMEIN%调用格式 22%if nargin2 error(comein needs at least two arguments.);end;if isa(p,queue)error(inputname(1),is not a queue);end;q0=p;qzzy=class(p);%for i=1:length(varargin)temp=varargini;s=eval(qzzy,(temp);%s.n
43、ame=inputname(i+1);if isempty(s.name)s.name=(class(temp);end if isempty(q0)q0=s;else q0=q0 s;end end if nargout=0;assignin(caller,inputname(1),q0);evalin(caller,inputname(1);else q=q0;end queuegoout.m function n,v,q=goout(p)%QUEUEGOOUT%调用格式%if nargin=0;error(No queue specifide.);end;if nargout3;erro
44、r(Too many output arguments.);end;if nargin1 error(Too many input arguments.);end;if isa(p,queue);error(inputname(1),is not a queue.);end;if isempty(p)q1=p;else m,n=size(p);v1=p(1).value;n1=p(1).name;if m*n=1 q1=queue;else q1=p(2:end);end end 23 if nargout=1;v=v1;end;if nargout=2;n=n1;end;if nargout
45、=3;q=q1;end;【例 7.10.2-2】本例的目的:一,检验例 7.10.2-1所编写的程序的正确性;二,演示所设计的新类是如何被运作的。(1)qe=Hello!你好你好你好你好!;Q=queue(qe)Q=qe:Hello!你好!(2)class(Q)isobject(Q)isa(Q,queue)ans=queue ans=1 ans=1 (3)isempty(Q)ans=0 【例 7.10.2-3】本例目的:一,演示“入队”、“离队”函数的调用方法;二,演示queuedisplay显示队列具体元素细节的功能。(1)a=1,2,3;4,5,6;b1=This;b2=is;b3=a c
46、ell array;comein(Q,a,b)Q=1*3 queue (2)display(Q,2)The content of Q(2)is a double object a=1 2 3 4 5 6 (3)nn,vv,QQ=goout(Q)nn=qe vv=Hello!你好!QQ=24 1*2 queue (4)display(QQ,1,2)The content of QQ(1,2)is a cell object b=This is a cell array 【例 7.10.2-4】利用指令 methods可以获知对任何类定义的(在类目录上的)所有方法函数。methods queue
47、Methods for class queue:comein display goout isempty queue 7.10.3 重载运算重载运算重载运算重载运算 7.10.4 继承性及其应用继承性及其应用继承性及其应用继承性及其应用 7.10.4.1 继承概念继承概念继承概念继承概念 7.10.4.2 class 函数调用格式汇总函数调用格式汇总函数调用格式汇总函数调用格式汇总 7.10.4.3 利用继承性创建子类的示例利用继承性创建子类的示例利用继承性创建子类的示例利用继承性创建子类的示例【例 7.10.4.3-1】把例 7.10.2-1构成的队列作为父类,利用继承性,创建 stack堆
48、栈子类。(1)mkdir(d:matlab6p5work,stack)cd d:matlab6p5workstack (2)stackstack.m function ST=stack(v)%调用格式%if nargin1;error(Too many arguments.);end;if nargin=0 Q=queue;s.value=;s.name=;elseif isa(v,stack);s=v;Q=queue(evalin(caller,inputname(1);else s.value=v;s.name=inputname(1);if isempty(s.name)s.name=(
49、class(v);25 end Q=queue(evalin(caller,inputname(1);end ST=class(s,stack,Q);【例 7.10.4.3-2】本例目的之一是:检查上例构造函数设计的正确性。目的之二是:观察堆栈关于队列的显示,类别判断和为“空”判断性质的继承。(1)AA=继承性继承性继承性继承性;ST=stack(AA)ST=(char):继承性 (2)class(ST)ans=stack (3)isa(ST,stack)isa(ST,queue)ans=1 ans=1 (4)isempty(ST)ans=0 【例 7.10.4.3-3】本例通过堆栈类对象的“压入”和“弹出”操作,进一步观察继承性。(1)BB=1:6;CC=sym(x2+4*x);comein(ST,BB,CC)ST=1*3 stack (2)显示堆栈中第三元素的内容显示堆栈中第三元素的内容显示堆栈中第三元素的内容显示堆栈中第三元素的内容 display(ST,3)The content of ST(3)is a sym object CC=x2+4*x (3)从堆栈弹出元素从堆栈弹出元素从堆栈弹出元素从堆栈弹出元素 Name1,Value1,ST_1=goout(ST)Name1=(char)Value1=继承性 ST_1=1*2 stack