Matlab与VC混合编程之一
1. 问题的提出,为什么需要用Matlab与VC混合编程
做工程项目时用的是VC,经常会用到科学计算的相关算法,比如矩阵求逆,求行列式,求微分方程组初值问题的数值解等问题。如果自己去编写相关的函数,首先需要去找一本较好的数值分析书,然后再根据书上的算法去编写相应的代码,之后再调试、测试,经常多次反复测试后,才可以放心使用。偷懒的方法也有,可以去网上搜索一些现成的代码,对找到的代码测试后才能放心使用。这两种方法都会消耗很大的精力和时间。有没有更好的方法?这就是本文要回答的问题。
我们都知道Matlab科学计算的强悍,大家都喜欢把跟数值运算或者相关工具箱有关的问题使用Matlab去求解。但是Matlab在做工程时其实时性或者界面达不到要求。现在我们把VC和Matlab的优点集成在一起,实现的方法就是Matlab与VC混合编程。混合编程是指在VC中调用Matlab的函数或者反过来在Matlab中调用VC的函数。这里先介绍前者,即在VC中调用Matlab的函数。我这里用的编译环境是VC 6.0和Matlab 7.0。其他版本的VC和Matlab的实现方式基本一样,有些跟Matlab版本相关的函数或者命令我会指出。
大家可以在图书馆找到相关的书籍或者网上找到相关的博文或者代码,这里是我对这些天来自己工作的总结。很多事情,看别人现成的很简单,自己亲自做做,会感觉不是那么回事,总会遇到这样那样的问题。这里将我遇到的问题和解决问题的方法也写出来,跟大家一起分享。
2. 实现混合编程的方法及特点
经过学习和摸索,目前实现在VC中调用Matlab函数的方法大概有5种,分别是:a.使用Matcom数学库,b.使用Matlab引擎(Engine),c.使用动态链接库DLL,d.使用COM(Component Object Model), e.使用Matlab 6.5提供的C\C++数学函数库。各种方法的特点如下:
a.使用Matcom数学库。Matcom使用简单,但只支持到Matlab 5.3版,且部分绘图显示不准确。
b.使用Matlab引擎(Engine)。使用简单,但是不能脱离Matlab环境独立运行。实际上,Matlab引擎在后台工作着,VC生成的.exe程序的运行时给Matlab引擎传递要执行的命令。如果不是工程项目,是推荐的方法之一。
c.使用动态链接库DLL。使用简单,但存在不能使用Matlab对象等一些限制,是推荐的方法之一。
d.使用COM。使用不是很简单,但是功能强大,几乎可以使用Matlab的所有功能。是推荐的方法之一。
e.使用Matlab 6.5提供的C\C++数学函数库。如果只是用数学函数库的话,是推荐的方法之一。该方法无法使用6.5版本之后的函数。
综合比较5种方法的特点,我首先选择了方法d使用COM来实现VC中调用Matlab函数,所以首先介绍我在使用这种方法遇到的问题及解决方法。
3. 使用COM:基础知识
COM是建立在二进制级别上的规范,不依赖于特定的开发语言。使用COM实现不同语言之间的协作开发是非常方便的。COM组件由一个或者多个COM对象构成,COM对象通过接口与使用COM的客户交互,如图1所示。
图1 COM组件
在VC中调用COM组件的步骤共4步,如下:
a.初