ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:274.05KB ,
资源ID:4409974      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4409974.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(matlab和VC混合编程综述.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

matlab和VC混合编程综述.docx

1、matlab和VC混合编程综述程序中使用MATLAB编译产生的DLL (VS2005, MATLAB7.5, mwArray)2007-12-16 14:52:39|分类:MatLab/Maple/Mat|字号订阅from:程序中使用MATLAB编译产生的DLL (VS2005, MATLAB7.5, mwArray)最近有几个帖子都在讨论有关在C+程序中使用MATLAB编译产生的动态链接库DLL。本来想用原来帖子中给出的m代码作为例子,无奈那段代码其实无法执行。为了避免分散注意力,也为了更好地讨论问题,于是决定还是另外新开一个主题,以简单的例子,和大家一起讨论如何在C+程序中使用matlab

2、编译产生的DLL。同时MATLAB最新版本R2007b刚刚发布不久,其中包含编译器4.7版,有了一些新的特性,于是也借这个例子来验证一下相关的技术有没有发生大的变化。最近讨论的问题是关于在C+程序中调用MATLAB编译产生的动态链接库。具体的问题是在调用DLL中函数时传递参数。我们知道,MATLAB可以把m代码编译成两种DLL,分别是C语言接口和C+语言接口的DLL。论坛上的问题是关于调用C+接口的DLL中的函数,所以这里我们就以这种DLL为例来介绍。在C+接口的DLL中,函数的输入、输出参数都是mwArray对象。所以问题归结为如何在C+程序中使用mwArray。这个问题本来可以只用一个简单

3、的C+程序来练习,而不需要MATLAB编译的DLL。不过为了模拟实际情况,选择以一个更为接近实际的m代码作为例子。在这个例子中,输入输出都是矩阵,至于标量,它也是一个一行、一列的矩阵。实验环境:Windows 2003 Std Server with SP2 (En),MATLAB R2007b,Visual Studio 2005。MATLAB安装路径:h:MATLABR2007b。实验内容:把一个简单的m代码编译成C+接口的DLL,然后在C+程序中调用。为了简单起见,这里的C+程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。下面是这个例子

4、用到的m代码。它定义了一个名为myadd2的函数:Copy to clipboard - CODE:function y,z = myadd2(a, b)% dummy function, just to demonstrate the ideay = a+b;z = a+2*b;end首先把这个函数编译成C+接口的DLL。为此,我们需要先设置MATLAB编译器。具体做法是在MATLAB命令行执行“mbuild -setup”。然后用下面这行命令把myadd2函数编译成一个C+接口的DLL:Copy to clipboard - CODE:mcc -W cpplib:libmyadd2 -T

5、link:lib myadd2结果,我们将会得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在内的一些文件。接下来我们只需要这四个文件。请注意:在MATLAB R2007b之前,这些文件都会在和编译的m代码所在的目录中,而在MATLAB R2007b,缺省情况下这些文件会在Documents and Settings中用户的My Documents目录中。此时,打开libmyadd2.h看看,在文件的最下面我们可以发现C+接口的函数定义。仔细观察过后,我们可以发现,这个接口函数的参数是按照这样的顺序定义的:输出参数的个数、输出

6、参数、以及输入参数。然后在VS2005中创建一个Win32 Console的VC+工程,我在测试时取名为testmyadd2_r2007b。把以上四个文件拷贝到VC+工程的源代码所在目录。接下来设置VC+,让它能找到MATLAB接口函数的定义及连接库函数。可以有两种设置方式:一种是改VS2005中关于VC+的设置,这样的好处是每个新的工程都能自动获得这个设定;而另一种是只改当前工程的设置,也就是设置只对该工程有效。这里用后一种方式。在VS2005中打开工程testmyadd2_r2007b,选择菜单“Project-Properties,在出来的对话框上,把MATLAB提供的include路径

7、加到VC+的头文件搜索路径。如图所示: 然后把相应的lib所在目录加到linker的额外搜索路径上。如图所示:接下来,告诉VC+,我们的这个程序需要连接到另外两个额外的库函数:libmyadd2.lib和mclmcrrt.lib。中间用空格隔开。如图所示:最后则是程序代码。这个程序只有一个main函数,其完整代码附在下面给大家参考。欢迎大家拍砖。谢谢!CODE:#include stdafx.h#include#include mclmcr.h#include mclcppclass.h#include libmyadd2.hint _tmain(int argc, _TCHAR* argv)

8、 std:cout Hello world! std:endl; /* Initialize the MCR */ if( !mclInitializeApplication(NULL,0) ) std:cout Could not initialize the application! std:endl; return -1; / initialize lib if( !libmyadd2Initialize() std:cout Could not initialize libmyadd2! std:endl; return -1; try / declare and initialize

9、 a mwArray a(2, 2,mxDOUBLE_CLASS); double *aData; aData = new double4; int i; for( i=0; i4; +i) aDatai = 1.0*i; / print output std:cout a = std:endl; std:cout aData0 , aData1 std:endl; std:cout aData2 , aData3 std:endl; a.SetData(aData, 4); / declare and initialize b mwArray b(2, 2,mxDOUBLE_CLASS);

10、b(1,1) = 11.; b(1,2) = 12.; b(2,1) = 21.; b(2,2) = 22.; mwArray y(2, 2,mxDOUBLE_CLASS); mwArray z(2, 2,mxDOUBLE_CLASS); / call the function myadd2(2, y, z, a, b); / copy data from mwArray to C+ objects / allocate outputs double *yData, *zData; yData = new double4; if( yData = NULL ) std:cout Failed

11、to allocate memory for yData! std:endl; return -1; zData = new double4; if( zData = NULL ) std:cout Failed to allocate memory for zData! std:endl; return -1; / copy data from mwArray to C+ y.GetData(yData, 4); z.GetData(zData, 4); / print output std:cout y = std:endl; std:cout yData0 , yData1 std:en

12、dl; std:cout yData2 , yData3 std:endl; std:cout z = std:endl; std:cout zData0 , zData1 std:endl; std:cout zData2 , zData3 std:endl; / deallocate memory delete aData; delete zData; delete yData; catch( const mwException& e) std:cerr e.what() std:endl; / terminate the lib libmyadd2Terminate(); / termi

13、nate MCR mclTerminateApplication(); return 0;2007-10-6 23:18实验的结果表明,在C+程序中使用MATLAB编译产生的C+接口DLL非常容易。mwArray也很容易使用。另外,最新的MATLAB R2007b中关于这部分并没有什么大的变化。这个练习适合MATLAB 7.0以后直到MATLAB R2007b的所有版本。ask:就我个人6.5混编的经验,我很少弄DLL,直接编译M文件为cpp,h文件即可,VC工程中引用,按.h文件格式调用即可。这样混编基本没有任何难度,将MATLAB程序看成MFC一个类即可,看看extern里面相关头文件的定

14、义,跟看MSDN一样。抛开mclTerminateApplication();这些,这应该是一个通用的办法手头只有6.5,不知道7.5还能生成cpp么?answer:从matlab7.0开始,其编译器的功能就和以前版本不一样了。它不再把m代码翻译成C/C+源代码,而是对m代码作个简单的wrapper,通常以动态链接库的形式提供给用户以方便用户在其他的程序中使用。所以,在matlab 7.x,编译m代码不能得到以前那种意义的C/C+源程序。不过,仅从软件开发的角度来看,我觉得用DLL来打包更为方便。如果m函数的接口不变,那么每次改变m代码后,我们只需重新编译m代码,获得新的DLL及CTF,而不需

15、要重新编译VC客户程序。这在开发大型软件时有很大的优越性。多谢taohe的文章,我想问一下,ctf文件是干嘛用的,谢谢,记得matlab 6.5版里面编译为DLL时没这个东西啊。这是matlab7.0以后matlab编译器的新特性。它和旧版技术不兼容。ctf其实就是一个zip文件,其中包含加密或者说编码过的一些m代码。其中有你自己的代码,以及matlab编译器通过分析你的代码根据依赖关系找到的其他一些m代码matlab7.0.1与vc6.0混合编程之DLL2009-10-24 20:35:53|分类:默认分类|字号订阅matlab7.0.1与vc6.0混合编程成功matlab2008-01-0

16、5 18:11 阅读600评论0字号:大大中中小小混合编程其实不难,关键是没有一个规范的,真正可以解决设置过程中出现的小问题的方法。我在设置的过程中,遇到了不少问题,花了多半天的时间,终于解决了,顺利地在vc中调用matlab 生成的dll文件中的函数,并返回一个值,探出对话框,显示正确。这种混合编程的方式不能脱离matlab环境,如果需要发布独立的应用程序,需要安装MCR。下面分步骤地讲一下混合编程的设置及其原因:1matlab方面的操作首先先写一个算阶乘的函数,存成test1.m文件,该文件的内容是:function y = test1(n)y = 1 ;for i = 1 : n y =

17、 y * i ;end现在有了文件,下一步我们要设置好系统,设置好matlab,然后再把该文件编译成dll文件。1、在环境变量(我的电脑右键-高级)path中加入binwin32;2、添加环境变量matlab值设为即matlab7.1的安装路径;3、配置mbuild使用的C/C+编译器; 在Matlab命令窗口中输入: mbuild -setup 按照提示选择VC6.0的编译器,完成后在Matlab命令窗口中输入: mex -setup 同样选择VC6.0的编译器,就完成编译器的安装和配置。接下来我们要把.m文件存储的程序编译成dll文件,在matlab命令窗口中输入:mcc -W lib:t

18、est1 -T link:lib test1.m这个需要等一小段时间,最终,在当前目录下生成了到此,在操作系统和matlab这一方面的工作就做完了2 vc+6.0中的操作在vc中建立一个MFC AppWizardexe基本对话框工程,名字叫做test1app.1)在VC中创建一个MFC工程(本人创建的为基于对话框的),环境设置根据如下帖子:怎样设置VisualStudio与MatlbComplier4.0一起工作中的指导进行。在本例子中,只需要在VC中进行如下步骤:A.Tools-Options-Directories-Showdirectoriesfor:Includefiles-Exter

19、nInclude;B.Tools-Options-Directories-Showdirectoriesfor:Libraryfiles-ExternLibWin32Microsoftmsvc60;C.Project-Setting-C/C+-Category:CodeGeneration-Userun-timelibrary:DebugMultithreadDLL;D.Project-Setting-Link-Category:Input-Object/librarymodules:test1.lib mclmcr.lib libmx.lib libmat.lib libeng.lib2)拷

20、贝MATLAB当前目录下刚才用mcc生成的test1.h,test1.dll,test1.lib,以及test1.ctf文件到VC当前工程目录下,并用Project-AddtoProject-Files将test1.h加入到当前工程中。3)在当前工程的对话框的头文件和cpp中加入#includetest1.h与#includemclmcr.h;工程设置到此就结束了,下面开始写代码:首先需要在对话框的初始化程序BOOL CTest1appDlg:OnInitDialog()内写if( !mclInitializeApplication(NULL,0) ) /matlab环境初始化AfxMessa

21、geBox( Could not initialize the application.);exit(1);/* Call the library intialization routine and make sure that the * library was initialized properly. */if (!test1Initialize() /test1Initialize是test1.h中定义的test1函数的初始化函数AfxMessageBox(Could not initialize the library.);exit(1);在对话框的确定按钮的消息响应函数内,调用dl

22、l中的阶乘函数,void CTest1appDlg:OnOK()/ TODO: Add extra validation here/此处为dll中的函数准备好参数,然后调用double n = 4 ; mxArray * t; /经过matlab编译完的dll 中的函数只能识别mxArray类型的参数,所以我们在vc中定义的数值/都需要转换成该种格式 t = mxCreateDoubleMatrix( 1 , 1 ,mxREAL);/该函数中的参数1,1定义了 t 这个矩阵的大小 memcpy(mxGetPr(t), & n, sizeof ( double );/给 t 赋值为4mxArra

23、y * y; /准备一个接收返回值的变量y = mxCreateDoubleMatrix( 1 , 1 ,mxREAL);mlfTest1(1,&y,t); /运行该函数,进行阶乘计算,4的double r1 = 0; /vc中的接收返回值的函数memcpy(&r1,mxGetPr(y),sizeof(double); mxDestroyArray(t); /销毁废弃内存 test1Terminate();/中止调用CString showrslt;showrslt.Format(%f,r1);AfxMessageBox(showrslt);/显示阶乘计算的结果CDialog:OnOK();

24、mxDestroyArray(t); /销毁废弃内存 test1Terminate();/中止调用CString showrslt;showrslt.Format(%f,r1);AfxMessageBox(showrslt);/显示阶乘计算的结果CDialog:OnOK();VC与Matlab混合编程(在VC中调用DLL)的实现本人所用系统为windows7旗舰版,MATLAB为R2008a和Microsoft Visual C+6.0编程环境。一、MATLAB编译环境的设置为了能够使用MATLAB的Complier将*.m函数文件编译为动态链接库DLL,必须对MATLAB的环境做出相应的设置

25、。具体做法如下:在MATLAB的Command Window下输入命令mbuild setup,并根据MATLAB的提示选择合适的编译器,笔者使用的是Microsoft Visual C+6.0,进行对C+连接环境的设置。过程如下: mbuild -setupPlease choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers y/n? ySelect a compiler:1 Lcc-win32 C 2.4.1 in

26、 D:/PROGRA1/MATLAB/R2008a/sys/lcc2 Microsoft Visual C+ 2005 in d:/Program Files/Microsoft Visual Studio 83 Microsoft Visual C+ 6.0 in D:/Program Files/Microsoft Visual Studio0 NoneCompiler: 3Please verify your choices:Compiler: Microsoft Visual C+ 6.0Location: D:/Program Files/Microsoft Visual StudioAre these correct y/n? yTrying to update options file:C:/Documents and Settings/hk/Application Data/MathWorks/MATLAB/R2008a/compopts.batFrom template:D:/PROGRA1/MATLAB/R2

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1