zoukankan      html  css  js  c++  java
  • 【转】三种方式在C++中调用matlab

     

      C/C++调用Matlab

      在工程实践中,C/C++调用Matlab 的方法主要有调用Matlab 计算引擎、包含m 文件转 换的C/C++文件,以及调用m文件生成的DLL 文件。

      1 利用Matlab计算引擎

      Matlab 的引擎库为用户提供了一些接口函数,利用这些接口函数,用户在自己的程序中以计算引擎方式调用Matlab 文件。该方法采用客户机/服务器的方式,利用Matlab 引擎 将Matlab 和C/C++联系起来。在实际应用中,C/C++程序为客户机,Matlab 作为本地服务器。

      C/C++程序向Matlab 计算引擎传递命令和数据信息,并从Matlab 计算引擎接收数据信息。

      Matlab 提供了以下几个C 语言计算引擎访问函数供用户使用:engOpen,engClose,engGetVariable,engPutVariable,engEvalString,engOutputBuffer,engOpenSingleUse, engGetVisible,engSetVisible。

      下面以C 语言编写的、调用Matlab 引擎计算方程x3 ?2x+5=0根的源程序example2.c 为 例,说明C/C++调用Matlab 计算引擎编程的原理和步骤:

      #include <windows.h>#include <stdlib.h>

      #include <stdio.h>#include "engine.h"

      int PASCAL WinMain (HANDLEhInstance, HANDLE hPrevInstance,

      LPSTR lpszCmdLine, intnCmdShow)

      { Engine *ep; mxArray *P=NULL,*r=NULL;

      char buffer[301]; doublepoly[4]={1,0,-2,5};

      if (!(ep=engOpen(NULL)))

      {fprintf(stderr," Can'tstart MATLAB engine ");return EXIT_FAILURE;}

      P=mxCreateDoubleMatrix(1,4,mxREAL);mxSetClassName(P,"p");

      memcpy((char*)mxGetPr(P),(char *)poly, 4*sizeof(double));

      engPutVariable(ep,P);engOutputBuffer(ep,buffer,300);

      engEvalString(ep,"disp(['多项式',poly2str(p,'x'),'的根']),r=roots(p)");

      MessageBox(NULL,buffer,"example2展示MATLAB 引擎的应用",MB_OK);

      engClose(ep);mxDestroyArray(P); return EXIT_SUCCESS; }

      在Matlab 下运行example2.exe: mex -f example2.c。运行结果如图1 所示:

     

     

      利用计算引擎调用Matlab的特点是:节省大量的系统资源,应用程序整体性能较好,但不能脱离Matlab的环境运行,且运行速度较慢,但在一些特别的应用[9](例如需要进行三维图形显示)时可考虑使用。

      2 利用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 -hexample3.

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

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

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

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

      e. 选择:工具-> 选项, 属性页选择“ 目录” ,在include files 加入:C:MATLAB6p5p1externinclude ,C:MATLAB6p5p1externincludecpp ; 然后在 Library files 里面加入: C:MATLAB6p5p1inwin32 ,C:MATLAB6p5p1extern libwin32microsoftmsvc60;注意根据用户的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 所示。

     

      3 利用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 文件的功能,极大地方便了用户的代码设计。

      

     

     

  • 相关阅读:
    暗时间:学习的精神和方法
    林布蘭
    魯本斯
    維梅爾
    哈爾斯.法蘭斯
    SAFEARRAY使用方法示例
    范戴克
    100个经典错别字
    在CPP中调用Jscript中的函数
    生活在真空中的程序员
  • 原文地址:https://www.cnblogs.com/arxive/p/5224739.html
Copyright © 2011-2022 走看看