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,"\nCan'tstart MATLAB engine\n");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:\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 所示。

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

  

【转】三种方式在C++中调用matlab的更多相关文章

  1. JavaScript 基础——使用js的三种方式,js中的变量,js中的输出语句,js中的运算符;js中的分支结构

    JavaScript 1.是什么:基于浏览器 基于(面向)对象 事件驱动 脚本语言 2.作用:表单验证,减轻服务器压力 添加野面动画效果 动态更改页面内容 Ajax网络请求 () 3.组成部分:ECM ...

  2. Struts2方法调用的三种方式(有新的!调用方法的说明)

    在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="heroAction" class="com.ABC ...

  3. Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)

    反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...

  4. 转 Velocity中加载vm文件的三种方式

    Velocity中加载vm文件的三种方式   velocitypropertiespath Velocity中加载vm文件的三种方式:    方式一:加载classpath目录下的vm文件 Prope ...

  5. WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式

    原文:WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式 由于WPF中没有提供PropertyGrid控件,有些业务需要此类的控件.这篇文章介绍在WPF中实现PropertyGr ...

  6. react-绑定this并传参的三种方式

    绑定this并传参的三种方式 在事件中绑定this并传参: <input type="button" value="在事件中绑定this并传参" onCl ...

  7. Oracle字符串行拆分成列的三种方式

    Oracle字符串行拆分成列的三种方式 --muphy 开发过程中经常会遇到将前台多个值用逗号连接一同传递到后台查询,这个用逗号连接的字符串分隔的每个字符串分别对应Oracle数据库表的不同行. 如下 ...

  8. Kubernetes 对象管理的三种方式

    Kubernetes 中文文档 1. Kubernetes 对象管理的三种方式对比 Kubernetes 中的对象管理方式,根据对象配置信息的位置不同可以分为两大类: 命令式:对象的参数通过命令指定 ...

  9. QTP--启动IE浏览器的三种方式

    第一种方式  创建浏览器对象模式 如果提示无法创建对象时需要先打开对象.   Set ie = CreateObject("InternetExplorer.Application" ...

随机推荐

  1. STL之list使用简介

    构造函数 list<int> c0; //空链表 list<); //建一个含三个默认值是0的元素的链表 list<,); //建一个含五个元素的链表,值都是2 list< ...

  2. Nginx主要模块常用指令说明

    核心模块(Core Modules): 主模块(Main Module):配置和服务器全局有关的一些参数,比如错误日志.进程.权限等 user worker_processes error_logsy ...

  3. 有许多部分没有在cgroup中显示啊,current/high/low/min等等

    没看见current/high/low/min 在cgroup中的显示内容

  4. 应用交付工程师Troubleshooting经验分享

    应用交付工程师Troubleshooting经验分享 来源:http://blog.51cto.com/virtualadc/1188328 来源:http://blog.51cto.com/virt ...

  5. php56升级后php7 mcrypt_encrypt 报错

    mcrypt_encrypt(MCRYPT_BLOWFISH, $passphrase, $data, MCRYPT_MODE_CBC, $iv); openssl_encrypt($data, &q ...

  6. a标签打电话

    <a href="tel:0147-88469258"></a> <a href="mailto:bd@pangxiekeji.com&qu ...

  7. Python 二进制,十进制,十六进制转换

    十六进制 到 十进制 使用 int() 函数 ,第一个参数是字符串 '0Xff' ,第二个参数是说明,这个字符串是几进制的数.  转化的结果是一个十进制数. >>> int('0xf ...

  8. post传参部分数据丢失

    tomcat获取post传的参数,只接收到前半部分参数,后半部分参数没有接收到 可能的原因是: tomcat中maxParameterCount是用来限制请求中的最大参数量,默认是10000,如果超过 ...

  9. 求LCA最近公共祖先的离线Tarjan算法_C++

    这个Tarjan算法是求LCA的算法,不是那个强连通图的 它是 离线 算法,时间复杂度是 O(m+n),m 是询问数,n 是节点数 它的优点是比在线算法好写很多 不过有些题目是强制在线的,此类离线算法 ...

  10. 【原创】SQL SERVER 2008 R2安装(多图详解)

    配置系统环境说明 操作系统:Windows 7 操作系统版本:旗舰版 SP1 操作系统位数:x64 注:其它系统配置也基本相似,只是可能菜单的名字或者所处位置不一样,具体的配置如有不同,请自行搜索 安 ...