
通过本书,读者将能够应用Matlab C++数学库,利用可视化应用程序开发工具Borland C++ Builder开发出独立于Matlab环境的应用程序。
全书分为10章,内容主要包括: 引言(第1章); C++面向对象程序设计基础(第2章); Matlab C++数学库的组成、安装和配置(第3章); Matlab C++数学库基础类--mwArray(第4章);运算符重载(第5章);库函数的调用方法(第6章);异常处理(第7章);作者对Matlab C++数学库的有关扩展(第8、9章); 最后作者还结合几个相关领域介绍了基于Matlab C++数学库的解决方案(第10章)。本书在论述中,始终贯穿了“Matlab C++数学库的应用”这一主线,力求理论联系实际,通过大量实例讲解相关要点(各章节的实例均可在清华大学出版社的网站上下载)。为使读者快速掌握并巩固相关知识,第2~10章后都配有习题。
本书可作为计算机应用、应用数学等相关专业的专业课教材;对于高校其他理工科相关专业的高年级本科生、研究生以及企业应用程序开发人员,本书亦有重要的参考价值。
理工科专业的大多数学生可能都有使用Matlab的经验。笔者依稀记得在大学求学期间,第一次使用Matlab时的那种难以抑制的欣喜和激动: 那是多么完美的一个作品!它提供了一个独一无二的集成环境,让你可以在它构筑的虚拟实验室里轻松地开发和验证自己的算法、进行系统仿真等多种工作;它还提供了丰富的图形用户界面,使得用户得以直观地观察自己的数据。
Matlab所提供的虚拟实验室无疑是令人叹为观止、流连忘返的。尽管如此,你终将不得不走出这个美妙的实验室,去解决现实世界的实际问题。例如,一个过程控制系统开发人员在Matlab环境中成功验证自己的算法后,必须将这个算法集成到实际系统中,不得不考虑一些实际问题,其中之一是系统能否脱离Matlab环境而独立运行以及运行效率问题。
笔者在攻读硕士学位时,就曾遇到过类似的困惑。当时要把一个用Matlab编写的过程控制算法移植到C++程序中(该程序最终要在工控机上运行),而这个算法涉及大量的矩阵运算,其中有矩阵求逆、sqr分解等。若是在Matlab环境下,几个简单的运算符和函数就轻松搞定,但面对的实际问题是,得用C++程序重写算法,这是多么可怕的任务!虽然最后花了九牛二虎之力总算是解决了任务,但仍不尽完美。那时,头脑中的一个想法日渐清晰: 为什么不采用由Matlab来完成复杂的矩阵运算,而C++程序只是给出一个前台界面的程序工作方式呢?通过阅读Matlab的帮助文档和相关出版物了解到,Matlab外部接口提供了这种方式,即使用Matlab引擎进行矩阵计算,通过动态数据交换机制和应用程序前台进行数据交换。当笔者怀着无比激动的心情重写了C++程序后,拿到实际的运行环境工作时,却发现,根本不能满足实际要求,程序执行效率太低,根本无法满足对设备的实时控制要求。
原来,Matlab引擎的工作方式不仅需要在系统中安装Matlab(要知道安装Matlab是一件多么耗时的工作!) ,而且其执行效率低(这与Matlab语言的解释机制有关)、系统开销大,所以无法满足许多应用场合的实时要求。后来,进一步阅读Matlab帮助文档,知道Matlab(当时使用的是Matlab 6.0)还提供了一个独立的Matlab C/C++数学库。按照其中的帮助,笔者进行了相关测试,发现Matlab C数学库运行得很好(程序完全编译链接通过,可以脱离Matlab正常运行),但是其函数在使用的方便性上与Matlab相差甚远;而Matlab C++数学库由于充分地运用了C++面向对象编程机制,对运算符实现了重载,故使用上几乎和Matlab语言一样简洁。遗憾的是,Matlab C++数学库在C++ Builder环境下始终没有编译成功,总是出现类似“...this line is too long to be truncated...”的错误提示。因为当时时间有限,未能解决问题,只好带着几许惆怅毕业了。所幸的是,当了一名大学教师,业余时间较为充裕,使得自己有时间思考这个问题的解决办法。
自工作以来,业余时间里,查资料,也浏览了相当多的Matlab程序设计方面的书籍,但是,始终没有找到Matlab C++数学库应用开发的解决方法,尤其是在当今流行的可视化应用程序开发工具下的解决方法。许多书籍尽管也介绍了相关问题,但要么是泛泛而谈,要么是经不起实践的检验。
由于一直未能从外部找到解决问题的办法,因此,笔者开始思考如何独立解决该问题,通过重新测试Matlab C++数学库,依旧发现了上述编译时的错误消息。经过分析发现: 原来在Matlab C++数学库提供的许多头文件中,大多数行的字符数超过常用编程工具编译器(如VC、C++ Builder)所能识别的范围,需要做回车换行处理。由于这种情况在大部分头文件中大量存在,因此手工更正这个问题几乎不可能。
为此,笔者专门开发了一个针对性很强的程序,用于实现对头文件中过长的代码行进行自动回车换行处理。经过处理后,再对若干处和C++语言现有语法冲突的地方做了相应修正,终于使得Matlab C++数学库可以成功地应用到C++Builder可视化应用程序开发环境中。接下来,开始逐步掌握Matlab C++数学库的编程思想和设计技术,在使用和学习中,笔者也发现了Matlab C++数学库的不足,即它缺乏Matlab那样的功能强大的可视化函数(如plot) ,为此笔者进一步自行开发了一个图形扩展函数库(本书将其命名为“Matlab C++扩展plot函数库”)和两个矩阵输入、输出可视化组件及运算符重载扩展函数库。希望它能给各位读者的科研工作带来一定的帮助,从而使用户在遇到类似问题时少走弯路。如果能达到这一目的,笔者将感到无比欣慰。
由于笔者水平有限,本书必定存在不少缺点和错误,殷切期望读者的批评、指正。
编 者2009年10月于桂林电子科技大学
第1章 引言1
第2章 C++数学库与面向对象程序设计5
2.1 面向对象程序设计的基本概念5
2.1.1 面向对象程序设计思想的发展5
2.1.2 面向对象程序设计的基本概念6
2.1.3 面向对象程序设计的特点6
2.2 C++程序设计基础7
2.2.1 C++语言与C语言的主要差异8
2.2.2 C++面向对象程序设计17
2.2.3 C++的异常处理机制35
2.3 思考与练习36
第3章 C++数学库与应用程序开发环境38
3.1 Borland C++Builder开发环境简介38
3.2 C++数学库的组成43
3.3 C++数学库的安装44
3.4 C++数学库与应用开发环境配置44
3.5 第一个Matlab C++应用程序46
3.6 发布Matlab C++应用程序49
3.7 思考与练习49
第4章 C++数学库的核心类--mwArray51
4.1 mwArray类的外部接口简介51
4.1.1 构造函数52
4.1.2 静态数据成员52
4.1.3 运算符重载52
4.1.4 成员函数53 4.2 创建mwArray数组的方法和原则54
4.3 数值数组的创建54
4.3.1 使用构造函数创建Numeric Array55
4.3.2 使用库函数创建数组60
4.3.3 通过连接创建新数组64
4.3.4 稀疏矩阵65
4.4 字符数组的创建69
4.4.1 使用构造函数创建字符数组70
4.4.2 将数值数组转换为字符数组70
4.4.3 将一维字符数组连接成二维字符数组71
4.5 细胞数组的创建71
4.5.1 使用cell()函数创建细胞数组72
4.5.2 使用细胞数组转换函数创建细胞数组72
4.5.3 通过连接创建细胞数组73
4.5.4 通过赋值创建细胞数组76
4.5.5 显示细胞数组中的内容77
4.6 数组元素的索引与访问77
4.6.1 使用一维下标78
4.6.2 使用N维下标82
4.6.3 使用逻辑下标86
4.6.4 在赋值表达式中使用下标88
4.6.5 删除数组中的元素89
4.6.6 从mwArray数组中提取数据91
4.6.7 细胞数组的索引94
4.6.8 数组维数及大小等相关信息的确定97
4.7 思考与练习99
◆MATLAB C++应用开发目 录第5章 数学运算符及应用103
5.1 加减运算符及其应用103
5.2 乘除运算符及其应用105
5.2.1 数组乘除105
5.2.2 矩阵乘除106
5.3 关系运算符及其应用109
5.4 逻辑运算符及其应用111
5.5 数学运算应用小结112
5.6 思考与练习114
第6章 C++数学库函数的调用116
6.1 仅有一个输出的函数调用116
6.2 具有一个或多个输入的函数调用117
6.3 具有多个输出的函数调用117
6.4 传递任意多个输入118
6.5 传递任意多个输出119
6.6 库函数调用规则小结120
6.7 将函数作为参数传递121
6.8 思考与练习123
第7章 C++数学库应用中的异常处理125
7.1 C++数学库中常用异常类126
7.2 使用异常类进行异常处理127
7.3 思考与练习130
第8章 mwArray数组的输入输出131
8.1 利用程序界面进行数组的输入输出131
8.1.1 控制台应用程序下数组输入输出131
8.1.2 窗口应用程序下数组的输入输出133
8.2 将mwArray数组保存到文件或从文件中读出138
8.2.1 使用文件流对象或文件操作函数138
8.2.2 Mat文件数据的导入和导出143
8.3 思考与练习147
第9章 数据可视化--扩展plot函数库149
9.1 Matlab C++扩展plot函数库简介149
9.1.1 开发背景149
9.1.2 功能介绍151
9.2 使用Matlab C++扩展plot函数库155
9.2.1 开发环境配置155
9.2.2 调用plot扩展函数库中的函数156
9.3 思考与练习159
第10章 C++数学库的综合应用举例161
10.1 Matlab C++数学库在频谱分析中的应用161
10.2 Matlab C++数学库在数据采集系统中的应用165
10.3 Matlab C++数学库在过程控制系统中的应用167
10.4 思考与练习168附录A 常用库函数170附录B Matlab外部接口简介182附录C 关于自定义工程模板185附录D 如何安装数组输入输出组件188附录E 如何安装运算符重载扩展函数库192参考文献193