基于VS2008和Matlab R2010b版本的混合编程的实现.doc_第1页
基于VS2008和Matlab R2010b版本的混合编程的实现.doc_第2页
基于VS2008和Matlab R2010b版本的混合编程的实现.doc_第3页
基于VS2008和Matlab R2010b版本的混合编程的实现.doc_第4页
全文预览已结束

下载本文档

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

文档简介

基于VS2008和Matlab R2010b版本的混合编程的实现转自: /thread-251748-1-1.html众所周知Matlab的强大运算能力让各种工程软件望而却步,而VC程序的友好界面又让人爱不释手,如果能够让两者的优势结合起来的话,势必能让程序员欢欣鼓舞。还好MathWorks已经为我们想到了,基本上现在市面上主流的Matlab版本都可以支持VC和Matlab的混合编程。但是目前网上资料基本上都是基于Matlab 6.0和VC 6.0的,和新版本的实现方法有所不同,因此笔者通过不断的尝试和研究,终于调试通了基于VS2008和Matlab R2010b的混合编程。为了更加直观的说明如何实现混合编程,笔者写了一个简单的程序作为测试。先在Matlab里面写一个M文件,代码如下:function b = MyFunc(a)b = a.*a;将M文件保存为MyFunc.m,保存在F:/test文件夹中。然后在Matlab主窗口中将当前文件夹改为F:/test:cd F:/test;为了能够让VC调用Matlab程序,我们可以采用将Matlab程序包装成动态链接文件DLL的形式,然后让VC调用动态链接文件,因此在Matlab中,我们需要设置一下Matlab的编译库,在Matlab主窗口中键入如下代码:mbuild setup然后出现Please choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers y/n?键入y后回车,出现Select a compiler:1 Lcc-win32 C 2.4.1 in D:PROGRA1MATLABR2010bsyslcc2 Microsoft Visual C+ 2008 SP1 in D:Program FilesMicrosoft Visual Studio 9.00 NoneCompiler:由于我们是需要用VC来调用Matlab函数,因此我们选择2,回车,出现Please verify your choices:Compiler: Microsoft Visual C+ 2008 SP1 Location: D:Program FilesMicrosoft Visual Studio 9.0Are these correct y/n?确定,键入y后回车,出现* Warning: Applications/components generated using Microsoft Visual Studio 2008 require that the Microsoft Visual Studio 2008 run-time libraries be available on the computer used for deployment. To redistribute your applications/components, be sure that the deployment machine has these run-time libraries. * Trying to update options file: C:Users张智宇AppDataRoamingMathWorksMATLABR2010bcompopts.batFrom template: D:PROGRA1MATLABR2010bbinwin32mbuildoptsmsvc90compp.batDone . . .如果出现以上说明,则证明Matlab编译器设置成功了。接下来是生成M文件的DLL文件。在Matlab主窗口中键入如下代码mmc W cpplib:MyDLL T link:lib MyFunc.m C其中cpplib:后面的是需要生成文件的文件名,是自己取的,link:lib后面的MyFunc.m是转换为DLL的M文件的文件名。 -W/-T/-C是参数,具体含义可以通过mcc help命令查看,注意参数的大小写。Matlab编译后会在Test文件夹下生成9个文件,分别是:mccEcxludedFiles.logMyDLL.cppMyDLL.ctfMyDLL.dllMyDLL.expMyDLL.exportsMyDLL.hMyDLL.libreadme.txt其中MyDLL.dll,MyDLL.lib,MyDLL.ctf,MyDLL.h是我们需要的文件,至此,Matlab方面就已经设置妥当了。打开VC2008,新建一个工程,然后将上述四个文件复制到工程目录下。选择“工具-选项-项目和解决方案-VC+目录”,在“显示以下内容目录”里选择“包含文件”将“D:Program FilesMATLABR2010bexterninclude”添加进去,然后选择“库文件”将“D:Program FilesMATLABR2010bexternlibwin32microsoft”添加进去,其中D:Program Files是Matlab的安装目录,可根据实际情况进行修改。然后选择“项目-属性-配置属性-链接器-输入”,在右边“附加依赖项”一栏填入“myDLL.lib mclmcrrt.lib”,其中MyDLL.lib就是刚刚用Matlab生成的lib文件。在编写代码时首先得包含头文件“MyDLL.h”,然后开始编写需要的代码,我为了说明问题编写了一个测试代码如下所示: MyDLLInitialize(); /初始化DLL动态连接文件double _x5 = 1,2,3,4,5; /输入数组double _y5; /输出数组mxArray* x = mxCreateDoubleMatrix(1, 5, mxREAL); /创建1*5矩阵memcpy(mxGetPr(x), (void*)_x, sizeof(_x); /拷贝输入数据mxArray *input1 = x; /将矩阵x的指针作为输入参数传递进去mxArray *output1; /定义输出参数指针mlxMyFunc(1,output,1,input); /调用m函数mxArray *y; /定义输出结果指针y = output0; /将输出参数传递给输出结果memcpy(_y, mxGetPr(y), sizeof(_y); /拷贝输出数据MyDLLTerminate(); /结束DLL库/显示数组中的数据CString str;str.Format(%f %f %f %f %f,_y0,_y1,_y2,_y3,_y4);MessageBox(str); 其中MyDLLInitialize(),mlxMyFunc(),MyDLLTerminate()等函数可以在MyDLL.h中找到函数原型,mlxMyFunc函数原型为:mlxMyFunc(int nlhs, mxArray *plhs, int nrhs, mxArray *prhs)nlhs代表输出参数个数,plhs里面存放的是输出参数的指针,nrhs代表输入参数个数,prhs中存放的是输入参数的指针。上例中由于输入输出参数只有一个,因此在plhs0中存放的就是M文件中b的指针,prhs0中存放的就是M文件中a的指针。编译运行之后就可以在弹出的消息框中得到所要的结果。将项目文件夹下生成的可执行文件复制出来,将MyDLL.dll文件、MyDLL.ctf文件和.exe文件放在同一目录下便可脱离VC+独立运行。如果需要在其他未装Matlab的机器上运行,则还需要将“D:Program FilesMATL

温馨提示

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

最新文档

评论

0/150

提交评论