首页 MATLAB的M文件和面向对象编程

MATLAB的M文件和面向对象编程

举报
开通vip

MATLAB的M文件和面向对象编程第七章 M文件和面向对象编程 第七章​  M文件和面向对象编程 假如读者想灵活运用MATLAB去解决实际问题,想充分调动MATLAB——科学技术资源,想理解MATLAB版本升级所依仗的基础,那么本章内容将十分有用。 本章将涉及比较深层的MATLAB内容:脚本;函数(一般函数、内联函数、子函数、私用函数、方法函数);函数句柄的创建和使用;程序调试和剖析;数据结构(类、对象);重载和继承;面向对象编程。本章配备了许多精心设计的算例。这些算例是完整的,可直接演练的。读者通过这些算例,将真切感受到抽象概念的内涵、各指令间...

MATLAB的M文件和面向对象编程
第七章 M文件和面向对象编程 第七章​  M文件和面向对象编程 假如读者想灵活运用MATLAB去解决实际问题,想充分调动MATLAB——科学技术资源,想理解MATLAB版本升级所依仗的基础,那么本章内容将十分有用。 本章将涉及比较深层的MATLAB内容:脚本;函数(一般函数、内联函数、子函数、私用函数、 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 函数);函数句柄的创建和使用;程序调试和剖析;数据结构(类、对象);重载和继承;面向对象编程。本章配备了许多精心设计的算例。这些算例是完整的,可直接演练的。读者通过这些算例,将真切感受到抽象概念的内涵、各指令间的协调,将从感知上领悟到面向对象编程的优越和至关要领。 本章新增了第7.7节,专门阐述函数句柄的创建和使用,它适用于MATLAB6.x版;而新增的第7.9.3节中关于程序性能优化的内容,则仅适用于MATLAB6.5以后版。 7.1​ 入门 【例7.1-1】通过M脚本文件,画出下列分段函数所 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示的曲面。 (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; 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)); 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); (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 规则: , ;且 。现要求该数组中第一个大于10000的元素。 a(1)=1;a(2)=1;i=2; while a(i)<=10000 a(i+1)=a(i-1)+a(i); i=i+1; end; i,a(i), i = 21 ans = 10946 7.3.3​ if-else-end分支结构 【例7.3.3-1】一个简单的分支结构。 cost=10;number=12; if number>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】学生的成绩管理,用来演示switch结构的应用。 clear; % for i=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); % for i=1:5 switch S(i).Marks case 100 S(i).Rank='满分'; case a S(i).Rank=' 优秀'; case b S(i).Rank=' 良好'; case c S(i).Rank=' 及格'; otherwise S(i).Rank='不及格'; 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】try-catch结构应用实例:对 魔方阵的行进行援引,当“行下标”超出魔方阵的最大行数时,将改向对最后一行的援引,并显示“出错”警告。 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指令 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脚本文件 7.4.2​ M函数文件 7.4.3​ 局部变量和全局变量 7.4.4​ M文件的一般结构 【例7.4.4-1】M函数文件示例。本例演示:(A)编写一个画任意半径任意色彩线型的圆。(B)完整函数文件的基本结构。(C)函数文件各基本组成部分的作用。 [exm07044_1.m] function sa = exm07044_1(r,s) %CIRCLE % % % if nargin>2 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​ 语法分析过程和伪代码 7.4.5.2​ P码文件的预生成 7.4.5.3​ 内存中P码文件的列表和清除 7.4.6​ MATLAB的搜索过程 7.5​ 变量的检测传递和限权使用函数 7.5.1​ 输入输出宗量检测指令 7.5.2​ “变长度”输入输出宗量 【例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; % <11> error(nargchk(1,Nin,nargin)) % if nargout>6 % error('Too many output arguments') end t=0:pi/20:2*pi;x=r*exp(i*t);s=pi*r*r; if nargout==0 switch Nin case 1 plot(x,'b') case 2 r2=varargin{1}; %<22> x2=r2*exp(i*t); plot(x,'b');hold on ;plot(x2,'b');hold off otherwise r2=varargin{1}; %<26> x2=r2*exp(i*t); plot(x,varargin{2:end});hold on % <28> plot(x2,varargin{2:end});hold off % <29> end; axis('square') else varargout{1}=real(x);varargout{2}=imag(x); %<33> varargout{5}=pi*r*r;varargout{6}=[]; %<34> if Nin>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',[1 0.4 0]) 图 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] 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=exm070531_1(8,sss{k}); subplot(1,3,k) plot(real(y0),imag(y0),'r','LineWidth',3),axis square image end 图 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=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]) 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】计算“语句”串,创建变量。 clear,t=pi;eval('theta=t/2,y=sin(theta)');who theta = 1.5708 y = 1 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; y(1,k)=eval([CEM{1},'(',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);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.3936 0.9193 0 0.2633 -0.6135 0.7897 7.6.3​ 内联函数 7.6.3.1​ 内联函数的创建 7.6.3.2​ 涉及内联函数性质的指令 7.6.3.3​ 内联函数创建和应用示例 【例7.6.3.3-1】演示:内联函数的第一种创建 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 ;使内联函数适于“数组运算”。 clear,F1=inline('sin(rho)/rho') F1 = Inline function: 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 = 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 ==> inline/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]; y2=Y2(x) y2 = 16.0000 6.0000 【例7.6.3.3-4】演示:最简练格式创建内联函数;内联函数可被feval 指令调用。 Z2=inline('P1*x*sin(x^2+P2)',2) Z2 = Inline function: 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 = 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:\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 = 1 1 (3) feval(Hy2,'line'); ??? Error using ==> feval Undefined function 'fhzzy'. 【例7.7.2-3】自建函数及其句柄的使用。 (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 shg (2) Hy3=@fhzzy fhzzy('line'); Hy3 = @fhzzy 图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) tt=(0:100)/100*2*pi; xx=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​ 直接调试法 7.9.2​ 调试器的使用 7.9.2.1​ 图形式调试器 图7.9-1 7.9.2.2​ 调试器应用示例 【例7.9.2.2.-1】本例的目标:对于任意随机向量,画出鲜明标志该随机向量均值、 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 差的频数直方图(如图7.9-2),或给出绘制这种图形的数据。 图7.9-2 (1) [exm070922_1.m] function [nn,xx,xmu,xstd]=exm070922_1(x) % xmu=mean(x); xstd=std(x); [nn,xx]=hist(x); if nargout==0 barzzy0(nn,xx,xmu,xstd) %<7> 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) %<11> plot(xxL,yy,'rx','MarkerSize',8) plot(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:\Master6\mfile\barzzy0.m On line 11 ==> plot(xxmu,yy,'r','Linewidth',3) %<11> Error in ==> D:\Master6\mfile\exm070922_1.m On line 7 ==> barzzy0(nn,xx,xmu,xstd) %<7> 图7.9-3 (3) (4) (5) randn('seed',1),x=randn(1,100);exm070922_1(x); 图7.9-3 图7.9-4 (7) 图7.9-5 (9) 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.3.2-1】试验JIT和加速器对M文件的加速作用。 7.9.3.3​ 程序性能的剖析 【例7.9.3.3-1】 演示界面式剖析器的使用。本例被剖析文件relaxzzy.m可从随书光盘的mfiles目录上得到。 (1) 图7.9-6 (2) 方法一: 方法二: (3) 图7.9-7 图7.9-8 7.10​ 面向对象编程 7.10.1​ 概念综述 7.10.1.1​ 类和对象 7.10.1.2​ 面向对象编程的内涵 (1)创建类目录 (2)选定待建类的数据结构 (3)对象构造函数 (4)显示函数 (5)与其他类之间的转换函数 (6)其他重载函数和重载运算 7.10.2​ 面向对象编程应用示例 【例7.10.2-1】本例演示:创建“先进先出”FIFO队列queue类的全过程。在本例中,读者应充分注意:构架域(Fields of a structure array)和定义在其上的方法函数(Method function)之间的关系。 (1) (2) (3) [@queue\queue.m] function q=queue(v) %@QUEUE\QUEUE % 调用格式 % % superiorto('double','sparse','struct','cell','char','inline','sym'); % <6> if nargin>1;error('Too many arguments.');end; if nargin==0 % q.value=[]; q.name=''; q=class(q,'queue'); elseif isa(v,'queue'); % q=v; % else % q.value=v; % q.name=inputname(1); if isempty(q.name) q.name=['(' class(v) ')']; end q=class(q,'queue'); % <20> end (4) [@queue\display.m] function display(q,ki,kj) %QUEUE\DISPLAY % 调用格式 % % % if nargin==0;error('缺少输入宗量,即被显示对象 !');end switch nargin case 1 [m,n]=size(q); vname=inputname(1); if isempty(vname) fprintf('ans=\n'); elseif fprintf('%s=\n',vname); end; if isempty(q) fprintf(' [ empty ') %<17> fprintf('%s',class(q)) %<18> fprintf(' ]\n\n'); %<19> elseif m*n==1; fprintf(' %s: ',q.name); disp(q.value); fprintf('\n'); else fprintf(' [ %d*%d ',m,n] %<25> fprintf('%s',class(q)) %<26> fprintf(' ]\n\n'); %<27> end case 2 disp(['The content of ',inputname(1),'(',int2str(ki),')']) disp(['is a ''',class(q(ki).value),''' object']) fprintf(' %s=\n',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) [@queue\isempty.m] function f=isempty(q) %@QUEUE\ISEMPTY f=0; [m,n]=size(q); if m*n==1; if isempty(q.value) & isempty(q.name) %<6> f=1; end; end; (6) [ @queue\comein.m] function q=comein(p,varargin) % @QUEUE\COMEIN % 调用格式 % % % if nargin<2 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); % <10> for i=1:length(varargin) temp=varargin{i}; s=eval([qzzy,'(temp)']); % <13> s.name=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 [@queue\goout.m] function [n,v,q]=goout(p) % @QUEUE\GOOUT % 调用格式 % % % % % if nargin==0 ;error('No queue specifide.');end; if nargout>3;error('Too many output arguments.');end; if nargin>1 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 if nargout<3; assignin('caller',inputname(1),q1); end; if nargout==0, evalin('caller',inputname(1)); end if nargout>=1;v=v1;end; if nargout>=2;n=n1;end; if nargout==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】本例目的:一,演示“入队”、“离队”函数的调用方法;二,演示@queue\display显示队列具体元素细节的功能。 (1) a=[1,2,3;4,5,6];b{1}='This';b{2}=' is ';b{3}='a cell 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= [ 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 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堆栈子类。 (1)​  mkdir('d:\matlab6p5\work','@stack') cd d:\matlab6p5\work\@stack (2) [@stack\stack.m] function ST=stack(v) % 调用格式 % % if nargin>1;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=['(' class(v) ')']; 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('x^2+4*x'); comein(ST,BB,CC) ST= [ 1*3 stack ] (2)显示堆栈中第三元素的内容 display(ST,3) The content of ST(3) is a 'sym' object CC= x^2+4*x (3)从堆栈弹出元素 [Name1,Value1,ST_1]=goout(ST) Name1 = (char) Value1 = 继承性 ST_1= [ 1*2 stack ]
本文档为【MATLAB的M文件和面向对象编程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_975469
暂无简介~
格式:doc
大小:3MB
软件:Word
页数:25
分类:互联网
上传时间:2011-07-11
浏览量:46