#Matlab 简易教程第八章 M文件和面向对象编程.docx
《#Matlab 简易教程第八章 M文件和面向对象编程.docx》由会员分享,可在线阅读,更多相关《#Matlab 简易教程第八章 M文件和面向对象编程.docx(29页珍藏版)》请在冰豆网上搜索。
#Matlab简易教程第八章M文件和面向对象编程
Matlab简易教程
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