当前位置:文档之家› C或C++调用Matlab程序

C或C++调用Matlab程序

1调用方式1.将Matlab程序编译为独立可执行文件可以脱离matlab运行exe程序,但需要MCR运行环境,对于有输入变量的函数而言,执行exe会出错,没什么实用价值2.C/C++程序调用Matlab引擎不能脱离matlab使用,实际上主要是用C/C++完成界面编写,通过接口函数调用matlab引擎,C/C++程序向matlab计算引擎传递命令和数据信息,并从matlab计算引擎接收数据信息,相当于在matlab中执行计算程序。

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

3.C/C++程序调用Matlab程序编译后的动态链接库可以完全脱离matlab使用,主要思想就是先编译m文件,将函数封装在库文件中,从而可以在C/C++程序中,通过调用DLL实现对matlab代码的调用。

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

4.C/C++程序调用Matlab程序编译后的COM组件C/C++调用COM组件和调用Matlab程序编译后的动态链接库和的执行效率是相同的,但调用动态链接库实现起来比较简单,调用COM组件实现起来比较复杂,很少使用。

2C/C++调用m文件编译后的动态链接库2.1Matlab设置步骤1.命令窗口输入mbuild –setup和mex–setup命令,选择VC++6.0编译器2.编写m文件,如add.m(脚本文件和函数文件都可以)function [a,b]=add(x,y)a=2*x+y;b=3*y;end3.生成dll文件输入命令:mcc -B cpplib:addadd.m或者mcc -W cpplib:add -T link:libadd.m4.提取add.ctf,add.h,add.dll,add.lib 共4个文件(更高版本的matlab没有ctf文件,只需另外3个就可以)2.2VC++6.0调用生成的dll文件1.Tools—Options—Directories—Include files,添加matlab内的include目录,如:D:\Program Files\MATLAB\R2007b\extern\include2.Tools—Options—Directories—Library files,添加matlab内的lib目录,如:D:\Program Files\MATLAB\R2007b\extern\lib\win32\microsoft3.新建控制台程序,命名add_test,将上述4个文件放到工程目录下;4.Project—Settings—Link—Input—Object/library modules,添加:add.libmclmcrrt.lib mclmcr.lib。

或者在预处理中加入下面代码#pragma comment(lib,"mclmcrrt.lib")#pragma comment(lib,"mclmcr.lib")#pragma comment(lib,"add.lib")或者将add.lib、mclmcrrt.lib、mclmcr.lib直接添加到工程中以上三种方法都是在连接时,使用了相应库文件中的函数。

5.新建cpp文件,命名为:add_test.cpp,代码如下//#pragma comment(lib,"mclmcrrt.lib")//#pragma comment(lib,"mclmcr.lib")//#pragma comment(lib,"add.lib")#include <iostream>#include "add.h"using namespace std;int main(){if(!addInitialize()){cout<<"initilize failed!!!"<<endl;return -1;}mwArraya(1,1,mxDOUBLE_CLASS);mwArray b(1,1,mxDOUBLE_CLASS);a(1,1)=20;b(1,1)=30;mwArray x(1,1,mxDOUBLE_CLASS);mwArray y(1,1,mxDOUBLE_CLASS);//输出参数个数,输出参数,输入参数add(2,x,y,a,b);double *i=new double;double *j=new double;x.GetData(i,1);y.GetData(j,1);cout<<"x="<<*i<<" y="<<*j<<endl;getchar();return 0;}3VC++6.0调用matlab引擎所谓matlab引擎,是指一组matlab提供的接口函数,支持C/C++、Fortran 等语言,通过这些接口函数,用户可以在其它编程环境中实现对matlab的控制。

主要功能有:打开/关闭一个matlab对话、向matlab环境发送命令字符串、从matlab环境中读取数据、向matlab环境中写入数据。

与其他各种接口相比,引擎所提供的matlab功能支持是最全面的,通过引擎方式,应用程序会打开一个新的matlab进程,可以控制它完成任何计算和绘图操作,对所有的数据结构提供100%的支持。

同时,引擎方式打开的matlab进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过engine方式控制matlab运行的流程,并可在其中输入任何matlab命令。

实际上,通过引擎方式建立的对话,是将matlab以ActiveX控件方式启动的。

3.1配置VC6编译器1.Tools—Options—Directories—Include files,添加matlab内的include目录,如:D:\Program Files\MATLAB\R2007b\extern\include2.Tools—Options—Directories—Library files,添加matlab内的lib目录,如:D:\Program Files\MATLAB\R2007b\extern\lib\win32\microsoft3.Project—Settings—Link—Input—Object/library modules,添加:libmx.liblibmat.lib libeng.lib或者在预处理中加入下面代码#pragma comment(lib,"libmx.lib")#pragma comment(lib,"libmat.lib")#pragma comment(lib,"libeng.lib")3.2程序实例新建控制台工程,命名engine_example,新建cpp文件,命名engine_example.cpp,程序代码如下//#pragma comment(lib,"libmx.lib")//#pragma comment(lib,"libmat.lib")//#pragma comment(lib,"libeng.lib")#include <iostream>#include "math.h"#include "engine.h"using namespace std;void main(){constint N=50;double x[N],y[N];int j=1;for (inti=0;i<N;i++){x[i]=i+1;y[i]=sin(x[i]+j*log(x[i]));j*=-1;}Engine *ep; //定义matlab引擎指针if(!(ep=engOpen(NULL))) //测试是否启动matlab引擎成功{cout<<"Can't start Matlab engine!"<<endl;exit(1);}//定义mxArray类型的1行N列的实数数组mxArray *xx=mxCreateDoubleMatrix(1,N,mxREAL);mxArray *yy=mxCreateDoubleMatrix(1,N,mxREAL);//将数组x复制到mxArray数组xx中,将数组y复制到mxArray数组yy中memcpy(mxGetPr(xx),x,N*sizeof(double));memcpy(mxGetPr(yy),y,N*sizeof(double));//将mxArray数组xx写入到matlab工作空间,命名为xx//将mxArray数组yy写入到matlab工作空间,命名为yyengPutVariable(ep,"xx",xx);engPutVariable(ep,"yy",yy);engEvalString(ep,"plot(xx,yy);"); //向matlab引擎发送画图命令mxDestroyArray(xx); //撤销mxArray数组xx和yymxDestroyArray(yy);cout<<"Press any key to exit!"<<endl;cin.get();engClose(ep); //关闭matlab引擎}。

相关主题