随笔-48  评论-259  文章-1  trackbacks-0
 

引言

    目前,Matlab广泛的应用于自动控制、数学运算、信号分析、图像处理、财务分析等各行各业。MATLAB也存在着某些缺点:Matlab是一种解释性语言,其特点是以矩阵为基本数据结构,导致其执行效率相对CC+ +语言要低很多;因为Matlab程序不能脱离其环境运行,故不能直接用于商用软件的开发。与此相反,VC++由于其丰富得人机界面,高效的执行效率已经成为基于Windows平台下开发商业软件的必备工具。然而,VC++对于复杂的数值运算就有点“力不从心”了。所以将VC++Matlab完美的结合,发挥各自的优势具有现实意义。自Matlab6.5版本开始,新推出来的Combuilder支持把用Matlab编写的程序做成com组件,供其他语言调用。该方法实现简单,通用性强,成为VCMatlab混合编程最有效的方法。

1  VCMatlab混合编程的方法

1.1 通过Matlab Engine方式

    Matlab Engine是指一组Matlab提供的接口函数,支持C语言, Matlab Engine采用C/S(客户机/服务器)模式,Matlab作为后台服务器,而C程序作为前台客户机,通过Windows的动态控件与服务器通信,向Matlab Engine传递命令和数据信息,从Matlab Engine接受数据信息。用户可以在前台应用程序中调用这些接口函数,实现对Matlab Engine的控制。采用这种方法几乎能利用Matlab全部功能,但是需要在机器上安装Matlab软件,而且执行效率低,因此在实际应用中不采用这种方法,在软件开发中也不可行,这种模式只适合个人使用或做演示。

1.2 直接调用MatlabC/C++数学函数库

    Matlab中提供了可以供C/C++语言调用的C/C++数学函数库,其中包含了大量用C/C++语言重新编写的Matlab数学函数,这些函数涉及到线形代数、数值分析、傅立叶变换、多项式计算、解微分方程等,并且函数库中提供了大量各种矩阵操作函数,在VC中可以直接使用这些函数,通过这些函数可以在VC中方便的实现在Matlab中矩阵运算功能。用这种方法可以很灵活的调用Matlab来编写应用程序,但要求读者对C/C++语言非常熟悉,并且这种模式不能包括所有的Matlab函数,尤其是无法充分使用Matlab提供的详尽的绘图函数。

1.3 Matlab自带的Matlab Compiler

    Matlab Compiler的作用是将m文件转化成C/C++代码(也就是通常所用的mcc命令),这种源代码需要用C/C++编译器编译连接成独立应用程序,在将m文件转成独立应用程序的过程中生成的C/C++文件,原则上是可以被其它的C/C++代码调用的,编译器可以通过设置mcc命令的选项,将m文件编译成动态链接库文件、C/C++文件、可执行文件等一系列文件。到matlab R21.1为止,Matlab Compilerm程序转换成C/C++代码功能有很多限制:

    ⑴不能转换脚本m文件,只能转换m函数;

    ⑵不能使用matlab对象;

    ⑶不能用input或者eval操作matlab空间变量;

    ⑷不能动态地命名变量,然后用load或者save命令来操作;

    ⑸不能处理具有嵌套调用其他m文件的m文件;

    ⑹不能使用MATLAB内联函数;

1.4 使用matcom工具

    这是第三方控件,很小(8M),原本属于mathtool公司,后来被Mathworks公司合并了,使用该工具可以将m脚本文件和m函数转化成相同功能的C/C++文件,相比其它方法使用matcom具有如下优点:

    ⑴转换过程简单(matcom工具自动实现),容易实现;

    ⑵可以方便的生成动态链接库文件(dll)和可执行文件(exe)

    ⑶不仅可以转换独立的脚本文件,也可以转换嵌套脚本文件;

    ⑷设置环境后,可以使用Matlab的工具箱函数;

matcom也有以下不足:

    ⑴对struct等类的支持有缺陷,对class数据类型;

    ⑵部分绘图语句无法实现或得不到准确图象,尤其是三维图象;

    ⑶当涉及到的复杂函数调用时嵌套的文件数量很多。

    因此在不涉及到三维做图以及m文件不大的情况下推荐使用。

1.5  使用MatlabCombuilde工具

    COMcomponent object module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它。Matlab6.5新推出来的Combuilder就是把用Matlab编写的程序做成com组件,供其他语言调用。该方法实现简单,通用性强,而且几乎可以使用Matlab的任何函数(注意:不支持脚本文件,脚本文件使用时要改为函数文件),因此在程序较大、调用工具箱函数或调用函数较多时推荐使用,这也是Matlab公司推荐的使用方法。

基于COM接口的MatlabVC混合编程实现FFT转换

2.1 创建Matlab源文件

    Matlab中实现FFT转换只需要一个函数即可。

    (1) 新建M文件,在M文件中输入以下两条语句:

    Function FFT(X,Y) %实现FFT转换。函数名为FFTx为输入参数,y为输出参数

    Y=fft(X);          %fft转换实现函数

    (2)保存为FFT.m M文件。

2.2  Matlab下创建COM组建

    (1)在matlab command window输入如下命令:

    >>comtool



 

    (2)出现com编辑界面后,选择File->New Project建立新工程testfft,并将FFT.m加入到新建工程中。

    (3)点击Build->COM Object…生成COM组件。

    至此com组件已经由matlab做好,默认的保存位置为:matlab安装位置\work\component

2.3  VC下调用COM组件

    (1)将testfft_idl.h testfft_idl_i.c文件拷贝到VC建立的工程目录下。两文件默认目录为\work\component\src

    (2)将目录/extern/include/下的mwcomtypes.h文件拷贝的VC建立的目录下。

    (3)将上面三个文件加入VC工程:工程->添加工程->Files,选择刚刚拷到目录下的testfft_idl.h testfft_idl_i.c文件。

    (4) 为程序添加头文件testfft_idl.h testfft_idl_i.cmwcomtypes.h

    (5)填写调用COM组件代码:

    if(FAILED(CoInitialize(NULL)))    //初始化调用com

    {

          AfxMessageBox("unable to initialize COM");

    }

    Itestfft *st=NULL;

    HRESULT hr=CoCreateInstance(CLSID_testfft,NULL,CLSCTX_ALL,IID_Itestfft,(void **)&st);

    if(SUCCEEDED(hr))

     {

         VARIANT x,y;

         VariantInit(&x);

         VariantInit(&y);

         x.vt=VT_I4;

         x.lVal=4;

    st->fte(x,y);       //x为输入参数,y为输出参数

    st->Release();

 }

     else

 {

    AfxMessageBox("unsucceed");

 }   

    至此实现VC下调用COM组件实现FFT转换。

结论

    实践表明用COM方法实现VCMatlab混合编程具有实现简单、执行效率高、几乎支持所有的matlab函数、易移植等优点。

posted on 2007-06-11 12:59 星梦情缘 阅读(4159) 评论(8)  编辑 收藏 引用 所属分类: 关于编程

评论:
# re: 基于COM接口的VC++与MATLAB混合编程 2007-06-11 13:25 | 星梦情缘
有用就顶,嘿嘿,
希望有更好的东西可以互相交流  回复  更多评论
  
# re: 基于COM接口的VC++与MATLAB混合编程 2007-06-11 13:36 | 小艾
好有用的文章哦,看来以后可以关注下MATLAB了,嘎嘎  回复  更多评论
  
# re: 基于COM接口的VC++与MATLAB混合编程 2007-06-12 09:02 | DxZ
貌似现在matlab compiler已经强多了。。还是脱离matlab环境来的爽啊。
R21.1是什么版本。。  回复  更多评论
  
# re: 基于COM接口的VC++与MATLAB混合编程 2007-06-30 17:59 | 雅典娜
请问你做过用matlab调用神经网络工具箱打包成com在vc中调用的程序吗?我现在正在作,有些问题无法解决,我将编写好,能够运行的m文件(调用神经网络工具箱的m文件)编译成com组件之后在vc里面调用总是提示组件中函数调用不成功,不知道是什么原因,如果可能,请给我回复一下,我的邮箱:mahuiyuok@163.com 谢谢。  回复  更多评论
  
# re: 基于COM接口的VC++与MATLAB混合编程 2008-08-20 09:18 | cherry
vc中如何通过com组件调用哪个matlab神经网络工具箱?对于简单的画图还能实现,但用到神经网络工具箱就出错了,什么原因?我的邮箱:282049028@qq.com  回复  更多评论
  
# re: 基于COM接口的VC++与MATLAB混合编程 2008-09-18 11:25 | 蒋方
@雅典娜
我也遇到了同样的问题,就是当一个函数的参数是一个.m文件名时,做成COM便不能执行这个函数,毛病出在哪里,望高手指教!!!我的QQ:727556719
e-mail:gxjxjtumu@163.com
  回复  更多评论
  
# re: 基于COM接口的VC++与MATLAB混合编程[未登录] 2008-10-10 17:28 | 1
MatlabX库为VB,VC,Delphi,c#提供程序包接口,支持数学运算、线性代数、图形处理和部分神经网络等功能,用于扩展 MATLAB 的功能和运行速度,可以作为独立的工具使用,支持生成自己的独立运行程序,不要求客户电脑装有matlab。 (可以另外加功能)

在VB,VC,Delphi,c#中使用该数学工具包可避免重复性劳动,从而减少开发人员实现算法和界面设计的困难,可大大提高开发效率,对于解决工程问题是十分有意义的。MatlabX就是一个小的matlab。

visual basic visual c++ delphi c# 调用 matlab 接口 神经网络 独立运行 sim
详情
http://matlabvbvc.blog.163.com/blog/static/27873611200731943916305/  回复  更多评论
  
# re: 基于COM接口的VC++与MATLAB混合编程 2009-03-30 08:29 | didi
我在vc中用一个对话框的两个button分别调用两个用combuild生成的com,总是报错。我都是用
CoInitialize(NULL);
Idata *pImyclass;
HRESULT hr=CoCreateInstance(CLSID_data,NULL,CLSCTX_ALL,IID_Idata,(void **)&pImyclass);
hr=pImyclass->data();
这样的代码。
可是只用一个button调用一个用combuild生成的com就会成功。
我想请教为什么和怎么修改。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理