matlab教程详解(6)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第七章M文件和面向对象编程假如读者想灵活运用MATLAB去解决实际问题,想充分调动MATLAB——科学技术资源,想理解MATLAB版本升级所依仗的基础,那么本章内容将十分有用。本章将涉及比较深层的MATLAB内容:脚本;函数(一般函数、内联函数、子函数、私用函数、方法函数);函数句柄的创建和使用;程序调试和剖析;数据结构(类、对象);重载和继承;面向对象编程。本章配备了许多精心设计的算例。这些算例是完整的,可直接演练的。读者通过这些算例,将真切感受到抽象概念的内涵、各指令间的协调,将从感知上领悟到面向对象编程的优越和至关要领。本章新增了第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.ma=2;b=2;%2clf;x=-a:0.2:a;y=-b:0.2:b;fori=1:length(y)2forj=1:length(x)ifx(j)+y(i)1z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j));elseifx(j)+y(i)=-1z(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);endendendaxis([-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;xx=123456789107.3.2while循环结构【例7.3.2-1】Fibonacci数组的元素满足Fibonacci规则:12kkkaaa,),2,1(k;3且121aa。现要求该数组中第一个大于10000的元素。a(1)=1;a(2)=1;i=2;whilea(i)=10000a(i+1)=a(i-1)+a(i);i=i+1;end;i,a(i),i=21ans=109467.3.3if-else-end分支结构【例7.3.3-1】一个简单的分支结构。cost=10;number=12;ifnumber8sums=number*0.95*cost;end,sumssums=114.0000【例7.3.3-2】用for循环指令来寻求Fibonacc数组中第一个大于10000的元素。n=100;a=ones(1,n);fori=3:na(i)=a(i-1)+a(i-2);ifa(i)=10000a(i),break;end;end,ians=10946i=217.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:5switchS(i).Markscase100S(i).Rank='满分';caseaS(i).Rank='优秀';4casebS(i).Rank='良好';casecS(i).Rank='及格';otherwiseS(i).Rank='不及格';endend%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结构应用实例:对)33(魔方阵的行进行援引,当“行下标”超出魔方阵的最大行数时,将改向对最后一行的援引,并显示“出错”警告。clear,N=4;A=magic(3);tryA_N=A(N,:)catchA_end=A(end,:)endlasterrA_end=492ans=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指令57.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%%%ifnargin2error('输入宗量太多。');end;ifnargin==1s='b';end;clf;t=0:pi/100:2*pi;x=r*exp(i*t);ifnargout==0plot(x,s);elsesa=pi*r*r;fill(real(x),imag(x),s)endaxis('square')7.4.5P码文件7.4.5.1语法分析过程和伪代码7.4.5.2P码文件的预生成7.4.5.3内存中P码文件的列表和清除7.4.6MATLAB的搜索过程67.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;%11error(nargchk(1,Nin,nargin))%ifnargout6%error('Toomanyoutputarguments')endt=0:pi/20:2*pi;x=r*exp(i*t);s=pi*r*r;ifnargout==0switchNincase1plot(x,'b')case2r2=varargin{1};%22x2=r2*exp(i*t);plot(x,'b');holdon;plot(x2,'b');holdoffotherwiser2=varargin{1};%26x2=r2*exp(i*t);plot(x,varargin{2:end});holdon%28plot(x2,varargin{2:end});holdoff%29end;axis('square')elsevarargout{1}=real(x);varargout{2}=imag(x);%33varargout{5}=pi*r*r;varargout{6}=[];%34ifNin1r2=varargin{1};%36x2=r2*exp(i*t);varargout{3}=real(x2);varargout{4}=imag(x2);%38varargout{6}=pi*(r^2-r2^2);%39end;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);7(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])-101-1-0.500.51-101-1-0.500.51-101-1-0.500.51图7.5-17.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)';switchscase{'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:3y0=exm070531_1(8,sss{k});subplot(1,3,k)plot(real(y0),imag(y0),'r','LineWidth',3),axissquareimageend8-20020-20-1001020-505-505-4-2024-4-2024图7.5-27.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])xyyy42167.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)');whotheta=1.5708y=19Yourvariablesare:tthetay【例7.6.1-3】计算“替代”串。A=ones(2,1);B=ones(1,3);c=eval('B*A','A*B'),errmessage=

1 / 25
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功