分享

c++ 与 matlab 混编

 北极闲人 2012-04-14

1. 目的-- 结合C++的速度和Matlab的方便。

Matlab can be slow,  C++ can be fast, – How can we integrate C++’s speed with Matlab’s convenience?
Goal:
-Implement critical functions with (fast) C++ code, and use (slow) Matlab code for data structure management (which
can be difficult/annoying in C++)。 

 

2.  常用方法

       (1)用Matlab Engin,采用户机/服务器(Client/Server)的计算模式。在VC中设计程序框架,作为前端客户机,通过调用Matlab 引擎与后台Matlab服务器建立连接,实现命令和数据信息的传递。这种方式需要Matlab在后台运行,离不开Matlab环境。不利于软件的开发,但 是它可以充分利用Matlab的功能,包括调用工具箱函数和图形函数。

  (2)用Matlab的编译器将.m源文件转化为c、c++等 各种不同类型的源代码,并在此基础上根据应用需要生成MEX文件、独立可执行应用程序等文件类型,大大提高程序的运行速度,提高代码的执行效率。主要是使 用mcc命令实现文件的转化。但是这种方法不支持图形函数,不能编译一些Matlab的内建函数,并且转换的代码可读性不太好。

  (3)使用Matcom编译器可以将Matlab源代码译成同等功能的C++代码,既保持了Matlab的优良算法,又提高了执行速度。它还支持一定的图形显示,生成代码的可读性很好。简单便捷、功能强大,但是有隐患, 比如rand函数的重复。

 

3.  利用mcc 编译器生成的cpp 和hpp 文件

  Matlab自带的C++Complier--mcc,能将m文件转换为C/C++代码。因此,它为C/C++程序调用m文件提供了另一种便捷的方法。下面举例说明相应步骤:

  a.新建example3.m:function y=exmaple3(n) y=0; for i=1:n y=y+i;end

  保存后在命令窗口中输入:mcc -t -L Cpp -h example3.

  则在工作目录下生成example3.cpp 和example3.hpp 两个文件。

  b.在VC 中新建一个基于对话框的MFC 应用程序Test2,添加一个按钮,并添加按钮响应函数,函数内容见f 步。将上面生成的两个文件拷贝到VC 工程的Test2 目录下。

  c.在VC 中选择:工程-》设置,选择属性表Link 选项,下拉菜单中选择Input,在对象 / 库模块中加入libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib libmwsglm.lib libmwservices.lib , 注意用空格分开; 而在忽略库中加入 msvcrt.lib;

  d.选择属性表C/C++选项,下拉菜单选General,在预处理程序定义中保留原来有的内 容,并添加MSVC,IBMPC,MSWIND,并用逗号隔开。选择下拉菜单的Precompiled Headers 选 项,在“自动使用预补偿页眉”中添加stdafx.h,然后确定。

  e. 选择: 工具-》 选项, 属性页选择“ 目录” , 在include files 加入: C:/MATLAB6p5p1/extern/include , C:/MATLAB6p5p1/extern/include/cpp ; 然后在 Library files 里面加入: C:/MATLAB6p5p1/bin/win32 , C:/MATLAB6p5p1/extern/ lib/win32/microsoft/msvc60;注意根据用户的Matlab 安装位置,修改相应目录。

  f.在响应函数中添加头文件:#include “matlab.hpp” #include “example3.hpp” 函数响应代码为:

  int i; mwArray n; n=10; n=example3(n); i=n.ExtractScalar(1);

  CString str; str.Format(“example3 的返回值是:%d”,i); AfxMessageBox(str);

  g. 编译,连接,执行,结果如图2 所示。

  

4.  利用mcc 编译器生成的的DLL 文件

  Matlab的C++ Complier不仅能够将Matlab的m文件转换为C/C++的源代码,还能产生完全 脱离Matlab运行环境的独立可执行DLL程序。从而可以在C/C++程序中,通过调用DLL实现对 Matlab代码的调用。下面通过一个简单的例子说明C/C++调用m文件生成的DLL:

  a.建立m文件example4.m: function result=example4(para)

  x=[1 para 3]; y=[1 3 1]; plot(x,y); result=para*2; end.然后在命令窗口中输入:

  mcc -t -W libhg:example4 -T link:lib -h libmmfile.mlib libmwsglm.mlib example4则在工作目录下会生成example4 .dll、example4 .lib和example4 .h三个文件。

  b.在VC中新建一个基于对话框的应用程序Test3,然后添加一个按钮及按钮响应函数,函数内容见d步,再将生成的3个文件拷贝到Test2工程目录下。

  c.VC编译环境的设置如同3.2节c、d步;

  d.在按钮函数文件添加如下的头文件:#include “example4 .h” ,函数响应代码为:

  mxArray* para=mxCreateDoubleScalar(2); mxArray* result; example4Initialize();

  result=mlfExample4(para); CString str;

  str.Format(“%f”,mxGetScalar(result)); AfxMessageBox(str);

  e.编译,连接,执行,结果如图3所示。

  

  利用mcc 编译器生成的DLL 动态连接库文件,只需在C/C++编译环境中将其包含进来, 调用导出函数即可实现原m 文件的功能,极大地方便了用户的代码设计。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多