第六部分 M文件和面向对象编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六部分 M 文件和面向对象编程
假如读者想灵活运用MA TLAB 去解决实际问题,想充分调动MATLAB ——科学技术资源,想理解MA TLAB 版本升级所依仗的基础,那么本章内容将十分有用。
本章将涉及比较深层的MATLAB 内容:脚本;函数(一般函数、内联函数、子函数、私用函数、方法函数);函数句柄的创建和使用;程序调试和剖析;数据结构(类、对象);重载和继承;面向对象编程。本章配备了许多精心设计的算例。这些算例是完整的,可直接演练的。读者通过这些算例,将真切感受到抽象概念的内涵、各指令间的协调,将从感知上领悟到面向对象编程的优越和至关要领。
本章新增了第6.7节,专门阐述函数句柄的创建和使用,它适用于MA TLAB6.x 版;(而新增的第6.9.3节中关于程序性能优化的内容,则仅适用于MA TLAB6.5以后版。)
6.1入门
本小节将通过编写脚本文件和函数文件来解决一个具体问题。通过这两个文件,可以初步了解M 文件。对于其中所涉及到的各种语言结构将在后面做详细介绍。
【例6.1-1】通过M 脚本文件,画出下列分段函数所表示的曲面。
⎪⎪⎩
⎪⎪⎨⎧-≤+≤+<->+=+-------15457.0117575.015457.0),(215.175.375.0216215.175.375.02112122212212
122x x e x x e x x e x x p x x x x x x x x
(1)编写M 脚本文件的步骤
图 6.1-1 a. 打开文件编辑(如上),输入如下一段程序:
[exm0601_1.m]
%exm0601_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);
b.点击编辑调试器工具条的保存图标,键入新编文件名(如exm0601_1),完成文件的保存;
(2)运行文件
a.使exm0601_1所在目录成为当前目录,或让该目录处在matlab的搜索路径上;
b.然后在指令窗运行指令(文件名),便可得到图形。
exm0601_1
图 6.1.2
【例6.1-2】通过M函数文件画出上例分段函数的曲面。
整个编程步骤和前面的相同。这里将演示如何在exm0601_1.m的基础上产生函数文件exm0601_2.m。
(1)在编辑调试器中,把exm0601_1.m“另存为”exm0601_2.m;
(2)用下面4行指令代替原文件的第<1><2>条指令。
function exm0601_2(a,b)
%This is my second example.
%a Define the limit of variable x.
%b Define the limit of variable y.
(3)保存修改后的exm0601_2.m文件。
(4)在指令窗中,运行以下指令,就能产生与图6.1.2完全相同的图形。
exm0601_2(2,2)
6.2M文本编辑器
Matlab Editor/Debugger是一个集编辑与调试两种功能于一体的工具环境。利用它不仅可以完成基本的文件编辑操作,还可以对M文件进行调试。这里先介绍它的文件编辑功能,调试功能在后面介绍。
(1)为创建新M文件,启动编译器的3种操作方法:
a. 在指令窗中运行指令edit;
b. 点击指令窗工具条上的新建文件图标;
c. 利用指令窗的[File:New]子菜单,再从右拉菜单中选择“M_file”项。
(2)打开已经有的M文件的3种操作方法:
a. 在指令窗中运行指令edit filename。filename是待打开的文件名,可不带扩展名。
b. 通过指令窗工具条上的打开图标,再从对话框中点选所需打开的文件。
c. 利用指令窗的[File:Open]子菜单,再从对话框中点选所需打开的文件。
(3)文件保存方法(略)/
6.3 MATLAB 控制流
Matlab 提供了5种控制程序流的结构:for 循环结构、while 循环结构、if_else_end 分支结构、以及switch-case 结构,try-catch 结构。matlab 的这5种控制指令用法与其他语言的十分类似。
6.3.1 for 循环结构
for x=array
(commands)
end
说明:for 指令后的变量x 称为循环变量,而for 与end 之间的组命令称为循环体。循环体被重复执行的次数是确定的,该次数由for 指令后面的数组array 的列数决定。换言之,循环变量依次取数组的各列,对于每个变量值,循环体被执行一次。
【例6.3.1-1】一个简单的for 循环示例。
for i=1:10; %i 依次取1,2,…,10
x(i)=i; %对每个I 值,重复执行由该指令构成的循环体
end;
x %要求显示运行后数组x 的值
x =
1 2 3 4 5 6 7 8 9 10
说明:
1. 在for 后面的表达式中的数组可以为任何合法的matlab 数组;
2. 循环结构可以嵌套使用;
3. 为了得到高效代码,应尽量提高代码的向量化程度,而避免使用循环结构;
4. 为了得到高效代码,在循环指令之前应尽量对数组进行预定义。
6.3.2 while 循环结构
while (expression )
(commands)
end
【例6.3.2-1】Fibonacci 数组的元素满足Fibonacci 规则:12+++=k k k a a a ,),2,1( =k ;且121==a a 。现要求该数组中第一个大于10000的元素。
a(1)=1;a(2)=1;i=2;
while a(i)<=10000
a(i+1)=a(i-1)+a(i); %当现有的元素仍小于10000时,求解下一个元素 i=i+1;
end;
i,a(i),
i =
21
ans =
10946
说明:
1. 一般情况下,表达式的值都是标量值,但是matlab 允许它为一个数组,此时只有当该数组所有元素均为真时,matlab 才会执行循环体;
2. 如while 指令后的数组为空数组时,matlab 认为表达式值为假,而不执行循环体。
6.3.3 if-else-end 分支结构
if-else-end 指令有多种形式,其中最简单的用法是: