内容简介
本书主要介绍如何运用Matlab与C/C++进行混合程序设计。共分8章,主要包括: Matlab程序设计初步、Matlab编译器、Matlab与C语言的接口、生成可独立运行的Matlab程序、Visual C++调用Matlab程序、Matlab DotNet Builder 与 Visual C ++、Matcom与C/C++以及Visual C++调用Matlab C++数学库。另外,附录中介绍有关动态链接库的基础知识。各章包含大量的实例程序,可供寻求将Matlab程序脱离Matlab环境的Matlab程序设计人员、寻求在Matlab中调用C/C++程序的程序设计人员、寻求在C/C++中调用Matlab程序的程序设计人员学习和参考。
本书附带一张光盘,其中包含各章实例程序的源代码。
前言
自MathWorks推出Matlab 7.0以后,Matlab编译器在很多方面都发生了很大变化。其中最大的变化是Matlab编译器不再将Matlab程序直接编译为C/C++代码,而只生成Matlab程序接口文件,Matlab程序则直接交给MCR(Matlab Component Runtime)来执行。新的Matlab编译器架构形成了新的Matlab与C/C++混合程序设计特点:
?
Matlab程序在MCR环境下与在Matlab环境下执行的效率相同,因此,通过编译Matlab程序不会提高Matlab程序的效率。
?
MCR的启动时间与Matlab程序的启动时间相同,在混合程序设计中应考虑这一点。
在C/C++程序中无论采用哪种调用方式调用Matlab程序,最终结果都是由MCR执行Matlab程序。
?
由于Matlab编译器只生成Matlab接口文件,而MCR接口一般会采用兼容设计,因此,与Matlab 6.5及以前版本的软件相比,用户开发C/C++混合程序设计的复杂度降低,可继承性提高。
?
由于采用MCR执行Matlab程序而不是将Matlab程序编译为C/C++程序,Matlab函数和工具箱中可编译的部分大大增加,为用户开发混合编程提供了方便。
正是存在这些诸多不同,原有的C/C++与Matlab混合程序设计的具体实现方法需要进行修正。为此,笔者对《精通Matlab与C/C++混合程序设计》第1版中的内容进行了相应增删或修正,形成了本书的内容。
所谓“万变不离其宗”,虽然Matlab编译器的架构发生了很大的变化,但Matlab与C/C++混合程序设计还是继承了原有思路。读者在应用中可根据自己的需求选择Matlab调用C/C++程序(MEX文件)、将Matlab程序编译为独立可执行文件、C/C++程序调用Matlab引擎、C /C++程序调用Matlab程序编译后的动态链接库以及C/C++程序调用Matlab程序编译后的COM组件等方式进行。
Matlab调用C/C++程序通过将其编译为MEX文件来实现,Matlab提供了一组C语言API函数供用户调用。这组API函数是Matlab与用户C程序之间的桥梁。通过调用C/C++程序编译的MEX文件,用户可以将Matlab程序中运算效率不高的代码用C/C++来实现,从而提高计算效率。
C/C++调用Matlab程序用户可以选择调用Matlab程序编译后的动态链接库或Matlab程序编译后的COM组件,这两种调用方法的执行效率是相同的。动态链接库方式实现起来比较简单,COM组件方式实现起来较复杂。除此之外,C/C++可以通过Matlab引擎直接执行Matlab程序,但这种方式不能脱离Matlab环境执行。
另外,书中还介绍了另外两种Matlab与C/C++混合程序设计的方法:Matcom C/C++数学库和Matlab C++数学库。其中,Matcom是第一个可以将Matlab *.m文件编译为C/C++代码的编译器。Matcom可以直接将m文件编译为C/C++代码,但只支持Matlab 5.3版。现在一般情况下没有必要使用Matcom编译Matlab程序,但Matcom的C++矩阵库仍然有一定的使用价值。Matlab C++数学库是Matlab提供的一组封装好的矩阵运算数学库,其使用方法和Matlab环境中的编写方法十分类似。如果用户用Visual C++实现用户界面,而又希望寻找一组高效的矩阵运算数学库的话,那么Matlab C++数学库是一个不错的选择。
Matlab与C/C++混合程序设计方法各有千秋,具体应用还要结合开发者的具体情况进行选择。但无论使用哪种方法,Matlab的数据结构与C /C++的数据结构之间的相互访问和转换都是混合编程的关键,这也是本书重点所在,希望读者在阅读和开发过程中引起注意。
本书所有的源代码均可在附带的光盘中找到。第7章“Matcom与C/C++”的开发和编译环境为Visual C++ 6.0与Matcom 4.5.1;第8章“VC++调用Matlab C++数学库”的开发和编译环境为Visual C++ 6.0与 Matlab 6.5.1;其他各章的开发和编译环境为Visual C++ 6.0与Matlab 2007。
在本书的编写过程中有幸得到很多同志的支持和帮助,在此感谢所有为本书的完成提供过帮助的同事和朋友。感谢网络上提供Matlab与C/C++混合程序设计资料的网友们,在学习Matlab与C/C++混合程序设计的过程中,这些资料使我受益匪浅。感谢我的妻子齐春溪女士,在她的大力支持和协助之下此书方得以顺利编写完成。
目录
第1章 Matlab程序设计初步1
1.1 Matlab程序设计特点1
1.1.1 Matlab Script文件1
1.1.2 Matlab表达式2
1.1.3 Matlab函数4
1.1.4 Matlab的向量运算6
1.1.5 Matlab的程序控制9
1.2 Matlab常用的数据类型12
1.2.1 数值阵列13
1.2.2 字符阵列15
1.2.3 元组阵列16
1.2.4 结构体阵列18
第2章 Matlab编译器21
2.1 Matlab编译器技术概述21
2.2 Matlab编译器的功能22
2.3 使用Matlab编译器的准备工作23
2.4 mcc编译器典型应用24
2.4.1 独立可执行文件24
2.4.2 C动态链接库30
2.4.3 C++动态链接库32
2.4.4 C/C++动态链接库的不同之处33
2.5 进一步了解mcc命令34
2.5.1 mcc常用命令选项34
2.5.2 捆绑命令文件(bundle file)35
2.6 Matlab编译器高级应用35
2.6.1 编译script文件35
2.6.2 Matlab编译器关联分析失效的情况36
2.6.3 从C/C++中调用Matlab内置函数(built?in function)38
2.6.4 可变参数传递(varargin,varargout)38
2.6.5 Matlab环境下执行和MCR执行的不同之处39
2.6.6 获取CTF文件的目录40
2.6.7 屏幕打印和错误信息显示函数41
2.7 Deployment Tool45
2.8 程序发布47
第3章 Matlab与C语言的接口48
3.1 Matlab C/C++编译器的设置(mex)48
3.2 Matlab中调用C程序?MEX文件49
3.2.1 MEX文件介绍49
3.2.2 MEX文件结构说明50
3.3 编译MEX文件51
3.4 Matlab中mxArray类型的操作51
3.5 Matlab与C语言混合编程常用的数据类型51
3.5.1 size_t类型51
3.5.2 Matlab C语言接口数据类型52
3.6 操作Matlab阵列mxArray的mx函数54
3.7 Matlab mex函数77
3.8 Matlab普通数值阵列的操作87
3.9 稀疏数组阵列(Sparse Array)89
3.10 Matlab元组92
3.11 Matlab结构体阵列94
3.12 Matlab字符阵列97
3.13 Matlab mat API函数98
3.14 Matlab API函数操作的实例105
3.14.1 更改Matlab数值阵列的维数105
3.14.2 分析并显示Matlab阵列的内容108
3.14.3 向MAT文件中写入mxArray变量118
3.14.4 从MAT文件中读取mxArray变量121
3.14.5 通讯录(结构体和MAT文件)125
3.15 在Visual C++中调试MEX文件131
第4章 生成可独立运行的Matlab程序138
4.1 直接编译M文件138
4.2 Matlab M文件中调用C函数138
4.3 在C语言中调用由Matlab?.m文件生成的函数141
4.4 利用Visual C++编译M文件并去掉控制台窗口145
第5章 Visual C++调用Matlab程序177
5.1 在Visual C++中调用Matlab引擎177
5.1.1 API函数介绍177
5.1.2 Visual C++调用Matlab引擎的实例178
5.2 Visual C++中调用Matlab?.m函数编译后的动态链接库186
第6章 Matlab Dotnet Builder与Visual C++198
6.1 COM基础知识198
6.1.1 COM组件概述198
6.1.2 COM组件开发的基础知识199
6.2 DotnetBuilder基础知识204
6.2.1 配置Matlab C/C++编译器204
6.2.2 使用Matlab DotnetBuilder204
6.3 Visual C调用DotnetBuilder生成的组件207
6.4 Matlab Dotnet Builder与Visual C++之间的数据转换218
6.4.1 VARIANT数据类型218
6.4.2 SAFEARRAY 数据类型220
6.4.3 SAFEARRAY的创建函数221
6.4.4 Matlab Dotnet Builder与Visual C++数据转换222
6.5 Matlab COM 工具库227
6.5.1 简介227
6.5.2 工具库的类(utility library classes)227
6.5.3 Matlab Dotnet Builder的枚举类型233
6.5.4 安装和发布控件234
6.6 综合实例235
6.6.1 实例1数据转换及数组格式标志的使用235
6.6.2 实例2采用MWUtil处理varargin输入和varargout输出238
6.6.3 实例3MWStruct和MWField操作实例241
6.6.4 实例4MWComplex操作实例250
6.6.5 实例5MWSParse操作实例253
第7章 Matcom与C/C++257
7.1 安装Matcom257
7.2 在VC++中使用Matcom C++矩阵库259
7.3 使用Matcom C++矩阵库的矩阵类Mm264
7.3.1 创建数值矩阵264
7.3.2 创建字符矩阵265
7.3.3 利用下标访问矩阵的元素265
7.3.4 获取矩阵数据的指针266
7.3.5 Mm矩阵对象的初始化267
7.3.6 Mm矩阵类的几个常用函数267
7.3.7 Matcom C++矩阵库常量269
7.3.8 调用系统函数270
7.4 Matcom C++矩阵库的图形和图像显示功能271
7.5 Matcom用于图形显示的常用函数273
7.6 Matcom进行图像显示的常用函数273
7.7 Matcom的应用实例274
7.7.1 实例1Mm矩阵的创建及使用274
7.7.2 实例2图形绘制的基本功能演示278
7.7.3 实例3利用Matcom绘制动态曲线282
7.7.4 实例4利用Matcom C++矩阵库进行图像显示293
7.7.5 实例5Matcom二维和三维曲线绘制综合应用303
第8章 Visual C++调用Matlab C++数学库316
8.1 Matlab C++ 数学库介绍316
8.2 在Visual C++工程中调用Matlab C++数学库316
8.3 Matlab C++数学库的使用318
8.3.1 输入和输出矩阵318
8.3.2 操作Matlab mwArray阵列322
8.3.3 调用系统函数341
附录 动态链接库基础知识344
A.1 为什么使用动态链接库?344
A.2 C/C++语言实现动态链接库345
A.3 C/C++语言动态链接库的不同348
A.4 动态链接库的调用方式348
A.4.1 隐式链接348
A.4.2 显式链接350
参考文献353