VC 调用 Matlab 的方法有多种,为了对混合编程有一个大概认识,将常用的几种方法中介绍一下:
一、通过 Matlab Engine 方式
Matlab Engine 是指一组 Matlab 提供的接口函数 , 支持 C 语言 , Matlab Engine 采用 C/S( 客户机 / 服务器 ) 模式 ,Matlab 作为后台服务器 , 而 C 程序作为前台客户机 , 通过 Windows 的动态控件与服务器通信 , 向 Matlab Engine 传递命令和数据信息 , 从 Matlab Engine 接受数据信息。用户可以在前台应用程序中调用这些接口函数 , 实现对 Matlab Engine 的控制。采用这种方法几乎能利用 Matlab 全部功能,但是需要在机器上安装 Matlab 软件,而且执行效率低,因此在实际应用中不采用这种方法,在软件开发中也不可行,我认为适合个人使用或做演示用,因此不打算介绍。
二、直接调用 Matlab 的 C/C++ 数学函数库
Matlab 中提供了可以供 C/C++ 语言调用的 C/C++ 数学函数库,其中包含了大量用 C\C++ 语言重新编写的 Matlab 数学函数,这些函数涉及到线形代数、数值分析、傅立叶变换、多项式计算、解微分方程等,并且函数库中提供了大量各种矩阵操作函数,在 VC 中可以直接使用这些函数,通过这些函数可以在 VC 中方便的实现在 Matlab 中矩阵运算功能。可以看出用这种方法可以很灵活的调用 Matlab 来编写应用程序,但要求读者对 C\C++ 语言比较熟悉,可以看出使用这种方法调用 Matlab 的工具箱函数有很大困难。适合对 C\C++ 语言比较熟悉的用户使用,
三、用 Matlab 自带的 Matlab Compiler
Matlab Compiler 的作用是将 m 文件转化成 C/C++ 代码(也就是通常所用的 mcc 命令) , 这种源代码需要用 C/C++ 编译器编译连接成独立应用程序,在将 m 文件转成独立应用程序的过程中生成的 C/C++ 文件,原则上是可以被其它的 C/C++ 代码调用的,编译器可以通过设置 mcc 命令的选项,将 m 文件编译成动态链接库文件、 C/C++ 文件、可执行文件等一系列文件。到 matlab R21.1 为止, Matlab Compiler 的 m 程序转换成 C/C++ 代码功能有很多限制:
1. 不能转换脚本 m 文件,只能转换 m 函数;
2. 不能使用 matlab 对象;
3. 不能用 input 或者 eval 操作 matlab 空间变量;
4. 不能动态地命名变量,然后用 load 或者 save 命令来操作;
5. 不能处理具有嵌套调用其他 m 文件的 m 文件;
6. 不能使用 MATLAB 内联函数;
四、使用 matlab 的 combuilder 工具
COM 是 component object module 的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它。 matlab6.5 新推出来的 combuilder 就是把用 matlab 编写的程序做成 com 组件,供其他语言调用。该方法实现简单,通用性强,而且几乎可以使用 Matlab 的任何函数 ( 注意:不支持脚本文件,脚本文件使用时要改为函数文件 ) ,因此在程序较大、调用工具箱函数或调用函数较多时推荐使用,这也是 Matlab 公司 (Matlab 公司就是 Mathworks 公司 ) 推荐的使用方法。
五、使用 matcom 工具。
这是个第三方控件,很小 (8M 多 ), 原本属于 mathtool 公司,后来被 Mathworks 公司合并了,使用该工具可以将 m 脚本文件和 m 函数转化成相同功能的 C\C++ 文件,相比其它方法使用 matcom 具有如下优点:
1. 转换过程简单 ( 由 matcom 工具自动实现 ) ,容易实现;
2. 可以方便的生成动态链接库文件 (dll) 和可执行文件 (exe) ;
3. 不仅可以转换独立的脚本文件,也可以转换嵌套脚本文件;
4. 设置环境后,可以使用 Matlab 的工具箱函数;
但 matcom 也有以下不足:
1. 对 struct 等类的支持有缺陷,对 class 数据类型;
2. 部分绘图语句无法实现或得不到准确图象,尤其是三维图象;
因此在不涉及到三维做图以及 m 文件不大的情况下推荐使用。
以上几种方法可以单独使用,也可以混合使用。这里简单的介绍了 VC 和 matlab 接口的几种方法,读者可以根据需要选择适合自己的方法。需要说明的是上以上几种方法并不是相互独立的,而是有相互联系的,比如使用 C/C++ 函数库与使用编译器,对于实现相同功能的程序,直接调用函数库与使用编译器最终生成的代码可能相差不大,只不过一个是直接在 VC 中写 C/C++ 代码,一个是在 Matlab 中写好 m 代码,然后通过编译器将 m 代码转化成相同功能的 C/C++ 代码,而在转化的过程中也需要调用相应的 C/C++ 函数库文件。在后面的文章中将从第二种方法开始进行介绍。