VC和Matlab混合编程4.doc_第1页
VC和Matlab混合编程4.doc_第2页
VC和Matlab混合编程4.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在VC中调用MATLAB的,总结有以下几种方法:1、是调用Matlab引擎;2、是调用Matlab中M函数转化成的dll文件;3、调用Matlab中M函数转化成c语言的函数。在本文当中重点讲解第二种方法,调用Matlab中M函数转换成DLL文件的形式。在我自己编写之前,查看了很多的文献,但是每个文献所应用的Matlab的版本不一样,很多数学函数对应的库不一样,导致最终的函数出错,本次练习和测试也是出现在了一个lib文件没有找到问题,查找了很长时间,一个一个的对出来才找到的错的原因。因此在开始我们编程之前想告诉大家的是,我们在中间过程当中可能会遇到很多的问题,但是这个时候一定要坚持下去,多查文献,同时积极向高手请教,只有这样才能做出成品,不然的话我们只能中途而废。好了,现在开始正文。在VC6.0下调用Matlab的M文件,基本可以分为一下几个大步骤,1、对Matlab的编译环境进行配置;2、编写M函数生成DLL文件;3、编写VC程序,对工程进行配置;4、调用生成的DLL文件中的函数;5、程序的调试和发布。一、Matlab编译环境的设置为了在开发时实现对MATLAB的具体功能的调用,应首先在操作系统中安装MATLAB工具软件,之后并运行此工具软件,依次执行mex setupmbuild setup此时一定要注意横线前面的空格(空格要的),最好不要复制,自己手工输入到Matlab的命令对话框当中,不然会出现错误,很多人在这里遇到了问题。 mex -setupPlease choose your compiler for building external interface (MEX) files: Would you like mex to locate installed compilers y/n? Select a compiler: 1 Lcc-win32 C 2.4.1 in D:PROGRA1MATLABR2009asyslcc 2 Microsoft Visual C+ 6.0 in D:Program FilesMicrosoft Visual Studio 0 None Compiler: 2Please verify your choices: Compiler: Microsoft Visual C+ 6.0 Location: D:Program FilesMicrosoft Visual Studio Are these correct y/n? Trying to update options file: C:UsersRobinAppDataRoamingMathWorksMATLABR2009amexopts.bat From template: D:PROGRA1MATLABR2009abinwin32mexoptsmsvc60opts.bat Done . . . * Warning: * 以上是运行mex setup的情况。 mbuild -setupPlease choose your compiler for building standalone MATLAB applications: Would you like mbuild to locate installed compilers y/n? Select a compiler: 1 Lcc-win32 C 2.4.1 in D:PROGRA1MATLABR2009asyslcc 2 Microsoft Visual C+ 6.0 in D:Program FilesMicrosoft Visual Studio 0 None Compiler: 2Please verify your choices: Compiler: Microsoft Visual C+ 6.0 Location: D:Program FilesMicrosoft Visual Studio Are these correct y/n? Trying to update options file: C:UsersRobinAppDataRoamingMathWorksMATLABR2009acompopts.bat From template: D:PROGRA1MATLABR2009abinwin32mbuildoptsmsvc60compp.bat Done . . . 以上为运行mbuild setup的情况。二、写M函数,创建动态链接库(*.DLL)1、创建动态链接库主要有两种方法:一种是使用 Matlab为VC+ IDE提供的Add-in。这种方法比较简单,方便快捷,只要 在VC+中创建工程的时候选择Matlab Project Wizard,并且在接下来的Step1中的Visual Matlab Application Type 选择 Shared M-DLL就可以了。接下来就是添加*.m文件, 进行编 译 了。另一种方法就是使用Matlab的mcc命令将*.m文件编译为动态链接库(*.DLL)。mccB csglsharedlib: youlibname function1 funcion2来创建我们所需要的动态链接库 DLL文件。其中参数-B表示使用的是Bundle Files作为参数,csglsharedlib是-B的参数,意 思是生成使用Matlab图形库的C共享动态链接库,youlibname是你想要生成的动态链接库 DLL的文件名,注意csglsharedlib与youlibname之间有一个冒号“:”连接,function1为你想要加入到动态链接库DLL中的函数名,如果有多个函数,各个函数名用空格隔开。举例:创建所需的Matlab函数文件 MyAdd.mfunction c = MyAdd(a, b); c = a + b; 然后,进行编译,命令如下:mcc -W cpplib:libMyAdd -T link:lib MyAdd其中,mcc是Matlab提供的编译命令,对于这一点,Matlab的帮助说明如下:-W lib:string link:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C+的lib,cpplib冒号后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的MyAdd,即你写的m函数的名字。运行完之后,你的目录下面,将会出现以下一些文件:libMyAdd.cpp libMyAdd.exp libMyAdd.dll libMyAdd.exports libMyAdd.h libMyAdd.prjlibMyAdd_mcc_component_data.c mccExcludedFiles.log readme.txt具体每一个文件的意思,请查帮助,这里只说其中很有用的几个:libMyAdd.dll是编译好的动态库,MyAdd这个函数封装在里面,libMyAdd.h是对应的头文件,在C里面调用这个函数的时候,需要include这个头文件,在这个头文件的最后,你可以看到下面的内容:extern LIB_libMyAdd_CPP_API void MW_CALL_CONV MyAdd(int nargout, mwArray& c, const mwArray& a, const mwArray& b);这就是MyAdd的C函数的声明。nargout表示输出变量的个数,a,b,c就是对应了m函数的几个变量。注意,a,b,c三个变量的类型是mwArray,这是Matlab提供的一个特殊的变量类型(在7.0的版本,编译之后,变量类型是mxArray)。mwArray是一个类,具体可以查帮助,当然后面也会讲到。三、在VC+中使用Matlab生成的动态链接库(*.DLL)首先新建一个基于MFC的对话框程序,太简单了,取名为Add,然后进行如下设置:1、设置 Include 和 Library 目录在VC+IDE中选择Tools-Options-Directories。在 Show directoris for:中选择Include files,添加如下两个目录:在 Show directoris for:中选择Library files,添加如下两个目录:这里假设为你的Matlab的安装目录。这些操作只需要一次。以后的工程中不需再进行操作。2、工程 (project)本身的一些设置 在 VC+ IDE中选择 Project-Setting-Link在Category中选择General,在Object/library modules中添加mclmcrrt.lib libmx.lib libmat.lib mclmcr.lib libMyAdd.lib3、为工程添加相应的文件把刚才生成的libMyAdd.h libMyAdd.dll libMyAdd.lib文件复制到VC+工程的文件夹下,并且用add to project/files 添加的工程中(如果遇到添加文件到工程的命令没有反应的时候可以尝试将Office卸载掉,我在编程的时候就遇到了这个问题)。4、使用DLL(1)首先要在使用DLL中函数的源文件中加上头文件libMyAdd.h。如下再加上另外两个数学函数的头文件:#include mclmcr.h #include matrix.h #include libMyAdd.h(2)注册DLL在使用之前还需要对libMyAdd.dll进注册,使用完毕之后需要对其进行释放。注册使用函数libMyAddInitiallize();释放使用函数libMyAddTerminate()。函数名的规则就是youlibname+Initialize(Terminate)。 这两函数在libMyAdd.h 中可以找到。libMyAddInitialize()不仅注册了刚才生成的libMyAdd.dll,同时它也注册了Matlab本身的一些动态链接库(*.DLL);同理libMyAddTerminate()不仅释放了刚才生成的libMyAdd.dll,同时它也释放了Matlab本身的一些动态链接库(*.DLL)。因此在注册了libMyAdd.dll之后,我们也可以使用 Matlab的数学库中的函数,例如mlfabs(),mlfAssign()等等 。 在使用libMyAdd.dll 的时候,存在着一个VC+和libMyAdd.dll中的函数之间数据交互的问题 。由于libMyAdd.dll中的函数所接受的参数是mxArray 型数据 。因此我们要使用Matlab为 我们提供的External Interfaces/ API 函数来创建mxArray 型数据,大量的API函数可参见Matlab 的帮助文件MatlabExternal Interfaces/API ReferenceC MX-Functionsx 小节。还有一个需要注意的问题就是原来的函数名myfun 变成了mlfMyfun。可以在libMyAdd.h中看到。下 面 就是一个 实 例 void CAddDlg:OnAdd() double a = 6; double b = 8; double c; if(!libMyAddInitialize() MessageBox(Could not initialize libMyAdd!); exit(-1); mwArray m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论