
本书以面向对象程序设计方法的基本特征(抽象、封装、继承、多态)为主线,由浅入深、循序渐进地展开,系统介绍了MATLAB面向对象程序设计的思想、设计方法等。全书重点突出、通俗易懂,各章节提供大量的程序代码供读者参考练习,多数章节安排了相应的应用实例。全书分为11章,主要分为三部分:一是MATLAB基本操作和程序设计基础、面向对象程序设计思想,以及MATLAB面向对象程序设计特点等(第1~2章);二是详细介绍了MATLAB中面向对象程序的开发过程和设计方法(第3~10章);三是MATLAB面向对象程序设计方法的综合应用实例(第11章)。 本书内容详实、科学合理,图文并茂、实例丰富,讲解系统透彻,通过本书的学习读者可以很快理解MATLAB面向对象程序设计的基本思想,掌握其设计方法,提高利用MATLAB解决问题的能力和效率。
推荐序一 很荣幸受电子工业出版社张国霞编辑之邀,代表MathWorks公司为出版社新书《MATLAB面向对象程序设计》作序,同时也感谢该书作者苗志宏、马金强两位老师选取了这么一个独特的视角来阐述MATLAB软件功能的强大,这在市场上众多介绍MATLAB程序设计语言或专业工具箱应用的书籍中显得非常特别。 从MATLAB自身定位来说,这是一种用于数值计算、可视化及程序设计的高级语言和交互式环境。使用 MATLAB,可以分析数据、开发算法、创建模型和应用程序。借助其语言、工具和内置数学函数,可以探求多种方法,比电子表格或传统程序设计语言(如 C/C++ 或 Java)更快地求取结果。但正是由于其丰富的库函数和灵活的程序设计风格,使得很多用户喜欢将MATLAB看作是一系列函数的集合,或者直接就是一系列对电脑下达的指令,从而忽视了程序的严谨与规范,使得在进行大型应用程序和数据结构的开发和维护时捉襟见肘。 从程序开发的角度来说,面向对象是一种程序设计规范,同时也是一种程序开发的方法。对象指的是类的实例。将对象作为程序的基本单元,把程序和数据封装于其中,以提高软件的重用性、灵活性和扩展性。从R2008a开始,MATLAB在这个方面终于有了一系列的重大更新,全新定义了如何在MATLAB中进行面向对象程序设计,比如:在类定义文件中如何定义各种属性、方法和事件,并控制其访问属性;通过定义句柄(handle)类,利用引用(reference)行为来处理类,帮助数据结构的创建,如链表;事件和监听特性,允许监控对象属性的变化和行为等。这些基本特征都在本书中得到了详细的介绍。 如作者所述,目前流行的C++、Java以及C#语言都是支持面向对象程序设计的语言,我们完全可以在这些语言上利用面向对象程序设计方法设计出复杂的应用软件。然而MATLAB具有强大的数据可视化功能以及包含诸多面向不同领域的工具箱,并且它是一个开放式、可扩展的程序设计环境,因此,可以充分利用MATLAB所提供的这些工具箱和各种功能,以面向对象的程序设计方法来更加方便、快捷地设计应用程序,以便解决不同领域中的实际问题。 因此,我相信随着此书的出版,必将大大方便大家对MATLAB面向对象程序设计的学习,加强MATLAB在该领域中的推广,提升大家的工程应用能力。在此,我郑重向大家推荐此书。 MathWorks 中国教育业务发展总监 陈炜博士 2014年5月于上海 推荐序二 面向对象程序设计(Object-oriented programming,OOP)是建立在对事物科学分类和描述基础上的程序设计方法,采用面向对象方法可以使系统各部分各司其职、各尽所能,为程序设计人员敞开了一扇大门,使程序设计的代码更简洁、更易于维护,并且具有更强的可重用性。 使用MATLAB将近10年了,MATLAB在R008a正式公开引入面向对象程序设计,OOP的加入使科学计算语言MATLAB更完美、更完整和更系统。本人也是MATLAB OOP的勇敢尝鲜者,目前写的绝大部分代码均采用面向对象的形式。 Package:相当于C++中的命令空间。程序员可用的单词数并不太多,并且不同人写的程序不可避免地出现函数重名现象,Package可以有效地解决这个问题。Package可以包含函数(Function)、类(Class)和包(Package)等。MATLAB安装目录下有很多“+”开头的文件夹就是Package。 Class:MATLAB包含数值类(Value)和句柄类(Handle),其中句柄类相当于C++中的引用(Reference),这是MATLAB语言自身的革命。有了句柄类,就可以在一个地方修改类属性,所有类对象拷贝中同步更新,同时句柄类提供了事件监听。MATLAB安装目录下有很多“@”开头的文件夹就是Class。 Properties:MATLAB 的Properties相对其他程序设计语言拥有更多的特性,使用户能更好地控制自己的Properties。唯一的遗憾就是不支持static特性。 Methods:同样,MATLAB 的Methods具有很多特性,辅助控制用户权限等。类似C#,MATLAB为Properties提供了两个特殊的方法:set()和get(),它们极大地丰富了对Properties的控制,一般set()方法最好配合AbortSet特性。 Event:事件是类似于MFC的消息,但是比消息更加强大,C++没有事件的概念。当事件发生的时候,Event定义类可以将事件广播出去,所有监听该事件的类均会收到这个消息,然后各自采取相应行动。Event在不修改原始类的前提下,完成了1对N的过程。 Enumeration:MATLAB将枚举作为一种特殊的类,MATLAB枚举类相对其他语言有两个优势,一是继承于数值类的枚举对象支持数学运算,比如Color.Red+Color.Blue;二是允许多个枚举对象使用相同的值,比如Switch.On、Switch.Open和Switch.True都可以等于1,它们表示同一个枚举值。 本书是国内介绍和推广MATLAB面向对象程序设计的先驱,相信本书的读者在阅读完书籍内容以后,对MATLAB有一种更新、更全、更高的认识:MATLAB不仅仅是一条条指令的集合和一个个工具箱的累加,它还是一种完整的、系统的高级科学计算程序设计语言。 如果迈粉们在MATLAB学习和使用过程中遇到任何疑问,尤其是Simulink基于模型设计方面,欢迎大家来网站http://www.matlabsky.com交流。另外本人编著的《MATLAB图像处理30个案例分析》一书预计在今年出版,欢迎点评指正。 MATLAB技术论坛创始人 詹福宇(Dynamic) 2014年5月 于成都 推荐序三 MATLAB是一种面向对象的高级程序设计语言,有着简单的语法规则和包罗万象的工具箱,在多个领域均有广泛的应用,受到越来越多程序开发人员的青睐。面向对象的程序设计,就是把面向对象的思想应用到软件工程中,并指导开发维护软件。MATLAB吸取了面向对象程序设计语言的优点,将数据和对数据的各种操作封装成类,通过创建类对象(即类的实例),调用类方法完成对数据的操作。这样做不仅增强了数据的安全性,而且提高了代码的可重用性、可维护性和可扩展性,这也使得进行大型应用程序的开发、维护变得更加便捷。 国内出版的有关MATLAB的著作可谓汗牛充栋,然而系统介绍MATLAB 面向对象程序设计的著作并不多见,这也正是本书的价值所在。在MATLAB新近发布的版本中,出现了越来越多的类,接触过新版本的用户也会觉得MATLAB越来越好用,但是大部分的用户并不知道什么是MATLAB类,而本书结合实例,用朴实和严谨的语言系统介绍了MATLAB 面向对象程序设计的基本概念和程序实现方法。我认为这是一本非常值得向希望系统学习MATLAB面向对象程序设计技术的程序开发人员、工程技术人员、科研人员和高校学生推荐的好书,在此书即将出版之际,我很荣幸为本书作序,向广大读者推荐此书。 MATLAB技术论坛创始人 天津科技大学理学院计算科学实验室主任 谢中华 2014年5月 前 言 MATLAB是MathWorks公司针对科学和工程计算开发的一款交互式软件,目前已发展成为集数值处理、图形处理、数学建模、实时控制、动态仿真和信号处理为一体的数学应用软件,并且成为目前世界上使用最广泛的科学计算软件之一。 虽然MATLAB的早期版本中已有类的概念,但其功能一般。从MATLAB R2008a开始,MathWorks对MATLAB的面向程序设计进行了一些重大更新,吸取了面向对象程序设计语言的优点,除了支持封装、继承和多态这些基本特征外,还支持包括属性、事件等新的特征,这使得进行大型应用程序的开发、维护变得更加便捷,并显著增加代码的可重用性、可维护性和可扩展性。 然而,目前国内图书市场上有关MATLAB的书籍多偏重于MATLAB语言程序设计介绍和各种工具箱的专题介绍,专门介绍MATLAB面向对象程序设计的书籍还很少见到,只是在部分书籍中简单提及过。另一方面,目前大多数MATLAB的使用者在编写程序时常采用面向过程的结构化设计思想来组织程序,MATLAB面向对象程序设计的方法还较少被使用。 结构化程序设计方法由于采用了模块分解与功能抽象以及自顶向下、分而治之的策略,从而有效地将一个复杂的程序设计系统的设计任务分解成许多易于控制和处理的子任务,使其便于开发和维护。但是它的缺点是:把数据与对数据的操作分离开来,数据的安全性很难得到保证;当数据结构发生改变时,所有相关的处理函数都要进行相应的修改,程序的可重用性差;特别是在开发图形用户界面应用程序时,程序的开发越来越困难。而面向对象程序设计强调直接面对客观存在的事物来进行软件开发,将人们认识事物的习惯思维方式应用于软件开发中。面向对象程序设计将数据和对象数据的操作封装在一起,形成一个有机的整体,使程序模块之间的关系更加简单、独立性更强,这样就使数据的安全性得到良好的保障。此外,通过面向对象程序设计的继承和多态机制可以大大提高程序的可重用性,从而提高程序开发的效率。 目前流行的C++、Java以及C#语言都是支持面向对象程序设计的语言,我们完全可以基于这些语言,利用面向对象程序设计的方法设计出复杂的应用软件。然而MATLAB具有强大数据可视化功能以及包含诸多面向不同领域的工具箱,并且它是一个开放式、可扩展的程序设计环境,因此可以充分利用MATLAB所提供的这些工具箱和各种功能,以面向对象程序设计的方法来更加方便、快捷地设计应用程序,从而解决不同领域中的实际问题。 为此,我们经过几年来的不断教学和实践,精心编写了《MATLAB面向对象程序设计》一书,全书按照面向对象程序设计的基本特征为主线,兼顾了MATLAB中一些特有功能,合理组织内容,力求知识点讲解透彻,同时尽可能多地穿插应用实例。全书共11章,具体内容如下。 第1章:MATLAB概述,介绍MATLAB的发展历程、体系结构、主要特征,MATLAB的安装与运行,MATLAB的集成环境和帮助系统的使用,MATLAB程序设计基础知识以及MATLAB图形用户界面的设计。 第2章:MATLAB面向对象程序设计概述,介绍面向对象程序设计的基本思想、特征,MATLAB中面向对象程序设计的基本流程、特点以及与其他面向对象程序设计语言的区别等。 第3章:按照“封装”的基本特征,主要介绍MATLAB面向对象程序设计中的核心概念“类及对象”,详细介绍在MATLAB下如何声明一个类、如何创建一个对象、如何编写一个类的构造函数以及类成员的访问控制等问题。这一章以介绍value型类为主。 第4章:主要介绍MATLAB下“继承与派生”有关的一些概念,如继承与派生、基类与派生类、单继承和多重继承等。 第5章:主要介绍handle型类和对象的概念、handle型类析构函数的定义、深拷贝和浅拷贝原理、如何使属性成员实现句柄图形类型的标准set/get接口风格以及在类中动态添加属性成员的过程。 第6章:主要介绍MATLAB面向对象程序设计中的对象阵列的创建过程。 第7章:按照“多态性”的基本特征,介绍MATLAB面向对象程序设计中的函数重载、运算符重载等内容。 第8章:主要介绍事件和听众的概念,以及如何使用事件模型来实现基于事件驱动的、具有交互响应功能的程序设计过程。 第9章:主要讲解MATLAB中枚举的作用、枚举类的定义方法和使用等。 第10章:主要讲解元类的基本概念,元类、元对象的使用方法,并结合实例详细介绍如何利用类元数据获取类信息的步骤、方法等。 第11章:综合前面介绍的内容,将MATLAB面向对象程序设计方法应用到关于倒立摆控制仿真设计和元胞自动机模拟设计问题中。 本书编写过程中大量参考了MATLAB软件帮助文档中的相关内容和实例;在涉及MATLAB的基本操作中,参考了文献[1~6]中的部分内容;在讲解面向对象程序设计的基本原理时,参照了文献[7~10]的部分内容;在元胞自动机模拟实现中,参考了文献[11~12]的部分内容。在此,向这些作者们表示谢意。作者在编写本书的过程中,对于书中每个原理都亲自在MATLAB上进行了检验,并为此编写了大量的验证性代码,某些部分的内容描述是作者归纳总结的结果,书中多数应用实例的程序设计具有一定的原创性。 本书由苗志宏负责统稿工作,并编写了第3、4、5、6、7、8、11章的内容,马金强编写了第1、2、9、10章的内容,李智慧参与了书稿的审阅工作。本书写作之初还得到了电子工业出版社张国霞编辑的鼓励和支持,在此深表谢意。由于作者能力所限,又是初次将MATLAB中面向对象程序设计的内容进行归纳、总结,书中难免存在错误和不足之处,诚挚欢迎各位同行、读者的批评指正。作者电子邮箱地址:miaozhh@21cn.com。 苗志宏 2014年5月9日
目 录 第1章 MATLAB入门 1 1.1 MATLAB概述 1 1.1.1 MATLAB的发展史 1 1.1.2 MATLAB体系结构 2 1.1.3 MATLAB功能特点 2 1.2 MATLAB的安装与运行 4 1.2.1 MATLAB的安装与激活 4 1.2.2 MATLAB的启动与退出 7 1.3 MATLAB开发环境 7 1.3.1 菜单栏 8 1.3.2 工具栏 12 1.3.3 MATLAB的窗口 12 1.4 MATLAB帮助和演示系统 17 1.4.1 命令窗口帮助系统 17 1.4.2 联机帮助 18 1.4.3 联机演示系统 19 1.5 矩阵及其运算 20 1.5.1 创建矩阵 20 1.5.2 矩阵访问 23 1.5.3 矩阵的赋值 24 1.5.4 矩阵的四则运算 25 1.5.5 点运算 26 1.5.6 矩阵的其他运算 27 1.5.7 矩阵操作 30 1.6 MATLAB图形用户界面设计 32 1.6.1 图形对象和句柄 32 1.6.2 图形窗口及坐标轴 34 1.6.3 用户界面对象 37 1.6.4 图形用户界面设计开发环境 41 1.7 小结 46 思考与练习 46 第2章 MATLAB面向对象程序设计概述 47 2.1 MATLAB程序设计基础 47 2.1.1 MATLAB的变量及数据类型 47 2.1.2 运算符与操作符 50 2.1.3 M文件介绍 51 2.1.4 函数的类型 54 2.1.5 MATLAB的程序设计原则 55 2.2 面向对象程序设计方法简介 56 2.2.1 程序设计方法的发展概述 56 2.2.2 面向对象程序设计方法 56 2.2.3 面向对象程序设计方法的优越性 57 2.2.4 面向对象程序设计的基本概念 57 2.2.5 面向对象程序设计方法中的基本特征 58 2.3 MATLAB面向对象程序设计简介 59 2.3.1 MATLAB中的类和对象 59 2.3.2 MATLAB中类的设计、定义 61 2.4 MATLAB面向对象程序设计特点 63 2.4.1 MATLAB面向对象程序设计的特点 63 2.4.2 MATLAB面向对象程序设计与其他语言 63 2.5 小结 64 思考与练习 64 第3章 MATLAB中的类和对象 65 3.1 类的声明 65 3.1.1 类的声明 65 3.1.2 对象的创建和使用 66 3.1.3 类的特属性 67 3.1.4 类定义的组织形式 67 3.1.5 命名空间和包 68 3.2 类的属性成员及访问控制 71 3.2.1 属性成员的声明和初始化 71 3.2.2 属性成员的特属性 71 3.2.3 属性成员的set和get方法 74 3.2.4 属性成员的访问控制 77 3.3 类的方法及访问控制 78 3.3.1 普通方法及访问控制 79 3.3.2 构造函数 81 3.3.3 静态方法 83 3.3.4 类型转换方法 85 3.4 类的组合 87 3.4.1 内嵌对象 88 3.4.2 类的优先级问题 88 3.4.3 对象的保存与加载 91 3.5 小结 92 思考与习题 93 第4章 MATLAB中的继承与派生 94 4.1 类的继承与派生 94 4.1.1 继承与派生的概念 94 4.1.2 派生类的定义 95 4.1.3 派生类生成过程 96 4.1.4 用派生类创建一个类的别名 99 4.2 派生类的构造函数 99 4.2.1 构造函数的建立 99 4.2.2 派生类构造函数执行的顺序 102 4.3 多重继承中的成员标识问题 104 4.3.1 属性成员名称冲突 105 4.3.2 方法名称冲突 105 4.3.3 事件名称冲突 107 4.4 指定容许派生的类 108 4.5 类成员的访问控制 109 4.5.1 属性成员的访问控制 109 4.5.2 方法的访问控制 110 4.5.3 事件的访问控制 114 4.6 定义MATLAB内置类型的派生类 115 4.6.1 MATLAB的内置类 115 4.6.2 定义MATLAB内置类的派生类 115 4.7 小结 120 思考与练习 120 第5章 handle型类 122 5.1 handle型类的声明 122 5.2 类handle的介绍 124 5.3 属性成员set/get接口的实现 125 5.4 动态属性成员的实现 127 5.5 handle型类的析构函数 130 5.6 handle-兼容类 135 5.7 深拷贝与浅拷贝 136 5.7.1 深拷贝与浅拷贝的概念 136 5.7.2 matlab.mixin.Copyable类简介 138 5.7.3 深拷贝的实现 139 5.8 应用实例 142 5.8.1 问题的提出 142 5.8.2 类的设计 142 5.8.3 源程序及运行效果 143 5.9 小结 146 思考与练习 146 第6章 对象阵列 147 6.1 MATLAB中常用的阵列形式 147 6.1.1 阵列的概念 147 6.1.2 几种常用的阵列 147 6.2 创建对象阵列 153 6.2.1 如何创建对象阵列 154 6.2.2 在对象阵列上添加动态属性成员 157 6.3 不同类型对象组成的对象阵列 158 6.3.1 不同类型对象的连接 158 6.3.2 转换方法的实现 159 6.4 多相对象阵列 160 6.4.1 matlab.mixin.Heterogeneous类及多相阵列创建 161 6.4.2 多相阵列的下标索引和连接 162 6.4.3 convertObject方法 163 6.5 小结 164 思考与练习 164 第7章 多态性 165 7.1 函数重载 165 7.2 运算符重载 169 7.2.1 运算符重载的实现 170 7.2.2 运算符重载中的优先级问题 172 7.2.3 subsref和subsasgn的重载 173 7.3 抽象类 179 7.3.1 抽象类的定义 179 7.3.2 有关抽象类的特殊规定 180 7.3.3 一个例子 180 7.4 小结 183 思考练习 183 第8章 事件与听众 185 8.1 事件与听众的概念 185 8.1.1 事件的概念及事件模型 185 8.1.2 听众的概念 186 8.2 定义事件和听众 186 8.2.1 如何命名一个事件 186 8.2.2 事件触发和广播 188 8.2.3 如何响应事件(听众的定义) 189 8.2.4 听众的几种创建方式 190 8.2.5 回调函数定义和调用 191 8.2.6 一个例子 192 8.3 属性成员事件的收听 197 8.3.1 属性成员事件 197 8.3.2 为属性成员事件创建听众 198 8.3.3 为听众定义回调函数 199 8.3.4 属性成员的AbortSet属性 199 8.4 动态属性成员事件响应 201 8.5 应用实例 204 8.5.1 问题的提出 204 8.5.2 类的设计 204 8.5.3 源程序及运行效果 205 8.6 小结 209 思考与练习 209 第9章 枚举 210 9.1 枚举概述 210 9.1.1 相关术语 210 9.1.2 枚举类型的分类 210 9.2 枚举类的定义和使用 211 9.2.1 枚举类的定义 211 9.2.2 枚举类中的方法 212 9.2.3 在枚举类中定义属性成员 212 9.2.4 枚举类的使用 213 9.2.5 枚举类与阵列 216 9.2.6 枚举类的构造函数调用顺序 216 9.2.7 枚举类在应用中的一些限制 217 9.3 小结 218 练习与思考 218 第10章 利用类元数据获取类信息 219 10.1 类元数据简介 219 10.1.1 相关概念 219 10.1.2 元类对象的创建和使用方法 219 10.2 元数据的使用 220 10.2.1 使用元数据查阅类和对象 220 10.2.2 查找具有指定设置的对象 223 10.2.3 获得关于属性成员的信息 225 10.2.4 获得属性成员的默认值 228 10.3 小结 230 思考与练习 230 第11章 综合应用实例 231 11.1 倒立摆控制演示实例 231 11.2 元胞自动机演示实例 237 11.3 小结 242 思考与练习 242 附录 MATLAB中的函数分类索引 243 参考文献 251