浅谈Matlab与Vc混编技术

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC调用*.m编译后的动态链接库
编译Matlab *.m文件
通过matlab编译器的mcc命令,可以将Matlab*.m文件直接编译为动态链接 库供Visual C++调用。以下面函数为例,采用mcc -B cssharedlib:libsincplot sincplot.m 将其编译为动态链接库,生成文件列表如图所示 %sincplot.m文件 function[y]=sincplot(n); x1=0.01:0.01:n*pi; y1=sin(x1)./x1; x2=-n*pi:0.01:-0.01; y2=sin(x2)./x2; y=[y2 y1]; plot([x2 x1],y);
Visual C++中调用COM组件的步骤
//得到COM库对象的CLSID
CLSID CLSID_MyInterface; HRESULT hr; hr = CLSIDFromProgID(L"Myinterfa ce.Myinterface1.0",&CLSID_M yinterface);
if(FAILD(hr)) { MessageBox("CLSIDFromPro gID调用失败"); return false; } //创建一个COM对象的实例 IMyInterface *pImyInterface; //IID_IMyInterface接口IMyInterfacede IID CoCreateInstance(CLSID_MyInte rface,NULL,CLSCTX_ALL,IID_ IMyInterface,(void**)&pIMyInte rface);
VARIANT数据类型
VARIANT数据类型
COM简单介绍
COM组件概述 COM是Component Object Model (组件对象模型)的缩写 由于COM是建立在二进制级别上的规范,所以组件对象之间的交互规 范不依赖于任何特定的开发语言。COM用于不同语言的协作开发是非常方便的 COM开发框架是以组件为基础的,可以吧组件看做是用于”搭建“软件的积木块, 采用这种开发模式除了跨语言的特性以外,还可以带来很多好处,例如采用组件 替换可以使得软件系统的升级更新换代更加简单,可以在多个不同的软件开发应 用中重复利用组件开发不同的应用软件等。 COM组件由一个或多个COM对象构成,COM对象通过接口与使用COM的客 户进行交互。使用COM组件的程序称为COM客户,COM对象对于COM客户来说 是不可见的,因而COM客户只能通过接口来访问COM对象。
COM 的存在 形式
com 组件 的标 志方 式
COM组件标志
CLSID && IID
typedef GUID CLSID; tupedef GUID IID; //组件标志 //接口标志 UUIDGEN.exe GUIDGEN.exe
ProgID
GUID记忆起来很困难,所以有些计算机语言采用ProgID来标识组 件,就好像是给组件起了一个很友好的名字。ProgID应该与GUID 一一对应。
浅谈Matlab与Vc混编技术
放大器组 作者:王 刚
为什么需要混编?
背景简介:
Matlab 是由Math Works 公司于1984 年推出的数值计算及图形处理软件, 可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处 理、图像处理等若干领域的计算和图形显示功能。其中,控制系统工具箱 的集成为设计和分析各种复杂的控制系统提供了有效的方法和途径。 但是,由于Matlab开发平台的局限性,在其上面开发的程序不能脱离Matlab 运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC++则在 一定程度上能够弥补这一漏洞,因此,现将二者结合共用,各献其长,可以 为科研工作和工程开发提供了更为强大的技术支持。
VC调用*.m编译后的动态链接库
VC工程设置
1.打开VC工程的Project|Setting对话框,在link|input选项中加入库文件 libemlrt.lib、libmex.lib、libut.lib、mclmcrrt.lib、libeng.lib、libmwlapack.lib、mclcom.lib、 mclxlmain.lib、libdflapack.lib、libmat.lib、libmx.lib、mclmcr.lib、libsincplot.lib 2.将libsincplot.dll复制到Windows系统目录或者工程的debug目录下,将libsincplot.h、libsincplot.lib和libsincplot.ctf文件复制到工程的源文件目录下,并将libsincplot.h文件添加到工程。
MCR ?
• • • • Matlab Component Runtime 时间:matlab 7.0 以后 作用:执行生成matlab接口文件 好处:可以在没有安装matlab的电 脑上运行
混编新特点
• matlab程序在MCR环境下与在Matlab环境 下执行效率相同,因此通过编译Matlab程 序不会提高Matlab程序的效率。 • 由于Matlab编译器只生成Matlab接口文件 ,而MCR接口文件一般会采用兼容设计, 因此,与matlab6.5及以前版本的软件相比 ,用户开发C/C++混合程序时的复杂度降低 ,可继承性提高。
用matlab生成CFra Baidu bibliotekM组件 matcom && VC++
使用MATLAB引擎
API函数介绍
1.int engClose(Engine * ep); 2.int engEvalString(Engine *ep,const char * name); 3.mxArray * engGetVariable(Engine *ep,const char* name); 4.int engGetVisible(Engine *ep,bool *value); 5.Engine *engOpen(const char *startcmd); 6.Engine *engOpenSingleUse(const char *sartcmd,void*dcom,int *retstatus); 7.int engOutputBuffer(Engine *ep,char *p,int n); 8.int engPutVariable(Engine *ep,const char*name,const mxArray *mp); 9.int engSetVisble(Engine *ep,bool value);
COM简单介绍
COM组件概述 COM是Component Object Model (组件对象模型)的缩写
由于COM是建立在二进制级别上的规范,所以组件对象之间的交互规 范不依赖于任何特定的开发语言。COM用于不同语言的协作开发是非常方便的 COM开发框架是以组件为基础的,可以吧组件看做是用于”搭建“软件的积木块, 采用这种开发模式除了跨语言的特性以外,还可以带来很多好处,例如采用组件 替换可以使得软件系统的升级更新换代更加简单,可以在多个不同的软件开发应 用中重复利用组件开发不同的应用软件等。
混编新特点
• MCR的启动时间和Matlab程序启动时间相 同,在混编中应当考虑到这一点。 • 由于采用了MCR执行Matlab程序而不是将 Matlab程序编译为C/C++程序,Matlab函数 和工具箱中可编译的部分大大增加,为用 户提供了方便。
matlab调用C/C++程序
•Matlab调用C/C++程序通过将其编译为MEX文件来实现。
VC调用*.m编译后的动态链接库
简单代码
mxArray *pArrayIn = NULL; mxArray *pArrayOut = NULL; pArrayIn = mxCreateDoubleMatrix(1,1,mxREAL); *(mxGetPr(pArrayIn)) = 10*(0.3+0.7*rand()*1.0/RAND_MAX); mlfSincplot(1,&pArrayOut,pArrayIn); mxDestroyArray(pArrayIn); mxDestroyArray(pArrayOut);
HRESULT 类型
错误的做法 正确的做法
...... HRESULT hr; hr = IMyInterface ->Myfun(...); if(hr == E_FALL) { return; }
........ HRESULT hr; hr = IMyInterface->MyFun(..) if(FALED(hr)) { return; }
Visual C++中调用COM组件的步骤
• • • • • 初始化COM库 得到COM对象的CLSID 创建一个COM对象的实例 使用COM对象 退出COM库
Visual C++中调用COM组件的步骤
//初始化COM库 HRESULT hr; hr = CoInitalize(NULL); if(FAILED(hr)) { return false; } //退出COM库 CoUninitialize();
COM在Windows平台下的实现方式
COM最早应用在OLE中,由于COM开发模型特有的优点, 现在COM组件已经渗透到了Windows的各个角落,为人熟 知的DriectX多媒体开发包就建立在COM组件技术之上。COM 在Windows平台上以动态链接库的形式存在。采用动态链接 库可以由COM组件客户决定什么时候加载所需要的COM组件 由于COM组件多种多样,为了区别众多的COM组件。COM 规范采用了128位长度的常量来标识COM组件。 typedef struct_GUID{ DWORD Data1; WORD Data2; WORD Data3; BYTE Data4[8]; }GUID;
使用MATLAB引擎
简单程序
Engine *m_ep; char m_outbuff[_MAX_BUFF_CHAR_NUM]; m_ep = engOpen(NULL); engOutputBuffer(m_ep,m_outbuff,_MAX_BUFF_CHAR_NUM); engEvalString(m_ep,"x1 = 123456"); engEvalString(m_ep,"x2 = 654321"); engEvalString(m_ep,"y = x1 + x2"); cout<<m_outbuff; engClose(m_ep); m_ep = NULL;
VC调用*.m编译后的动态链接库
函数调用: 1.在MATLAB当中,我们利用M文件来实现函数,每一个M文件实现一个单独的功 能,这一点和C语言当中的函数是相互对应的。 2.MATLAB所有的计算都是基于一种名为mxArray的数据结构之上的, 所有的浮点数、向量或者是矩阵在MATLAB当中都是通过mxArray结构来进行存 储和传递的。当然,MATLAB所提供的所有数学函数也都是基于这样一种数据结 构进行运算的。所以,要使用MATLAB的生成代码,就必须将C语言当中常用的 浮点数和整数转换为mxArray结构。
DotnetBuilder 与 VisualC++
编译器配置&使用
如果使用Matlab DotnetBuilder以前还没有配置Matlab C/C++编译器的话,需 要首先运行: >>mbuild -setup 然后配置Matlab C/C++编译器 使用 Matlab DotnetBuilder: D:\3D仿真系统项目组\Vs2005与matlab2007a混编基本步骤与环境配置.doc
•Matlab提供了一组C语言API函数供用户调用
•这组API函数是Matlab与用户C程序之间的桥梁。
•通过调用C/C++程序编译的MEX文件,用户可以将Matlab程序中运 算效率不高的代码用C/C++来实现,从而提高计算效率。
C/C++中调用Matlab
使用MATLAB引擎
用matlab生成DLL
相关文档
最新文档