C与Matlab混合编程.doc_第1页
C与Matlab混合编程.doc_第2页
C与Matlab混合编程.doc_第3页
C与Matlab混合编程.doc_第4页
C与Matlab混合编程.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

VC 2010与Matlab 2010混合编程青岛福沃德电子信息科技有限公司/ 在最近的项目中,需要用C调用Matlab的函数,在网上找了一些相关的资料,遇到一些问题。在这里结合一下自己的实现过程,把整个过程整理一下。1 实验环境Windows 7。Matlab 2010b,安装路径:E:Program FilesMatlabR2010b。VC 2010,安装路径:C:Program FilesMicrosoft Visual Studio 10.0。2 Matlab生成DLL2.1 编译器的安装在Matlab中先安装C编译器,当然要先确定电脑里已经安装了相关的编译器。打开Matlab 2010b,在命令窗口输入mbuild setup以下是具体命令窗口里的选项选择,当然我只安装了VC 2010的编译器,在编译器选项里只有1个。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 E:PROGRA1MATLABR2010bsyslcc2 Microsoft Visual C+ 2010 in C:Program FilesMicrosoft Visual Studio 10.00 NoneCompiler: 2Please verify your choices:Compiler: Microsoft Visual C+ 2010Location: C:Program FilesMicrosoft Visual Studio 10.0Are these correct y/n? y*Warning: Applications/components generated using Microsoft Visual C+2010 require that the Microsoft Visual Studio 2010 run-timelibraries be available on the computer used for deployment.To redistribute your applications/components, be sure that thedeployment machine has these run-time libraries.*Trying to update options file: C:UsersBaoQiAppDataRoamingMathWorksMATLABR2010bcompopts.batFrom template: E:PROGRA1MATLABR2010bbinwin32mbuildoptsmsvc100compp.batDone . . .到这里已经安装了编译器。2.2 Matlab中DLL的生成在这里为了方便测试,以一个简单的例子加法讲解。首先在matlab里新建一个m文件,文件名为myadd2.m,定义了一个名为myadd2的函数,代码如下:/function y,z = myadd2(a, b)% dummy function, just to demonstrate the ideay = a+b;z = a+2*b;end/在Matlab命令框中输入以下命令:(确保)mcc -W cpplib:libmyadd2 -T link:lib myadd2.mmyadd2为函数名,生成libmyadd2.lib、libmyadd2.h、libmyadd2.dll等文件,在VC中调用时要用到这三个文件。3 VC 2010调用Matlab的DLL3.1 新建项目新建一个Win 32控制台应用程序,我取的名字是matlabDll2。当然新建其他的项目类型也可以,这只是个例子。接下来进行配置,在该项目的属性中进行了配置,只对该项目有效,若建新的项目需要重新配置。项目建好后将libmyadd2.lib、libmyadd2.h、libmyadd2.dll复制到项目目录下。3.2 环境配置首先配置项目属性页/配置属性/C-C+/常规/附加包含目录,请根据自己电脑上软件的安装位置对照设置,在这里为了方便,用的是网上博客的截图,VS 2010、VS 2008、VS 2005的界面大同小异,见图1。图1其次配置项目属性页/配置属性/链接器/常规/附加库目录,请根据自己电脑上软件的安装位置对照设置,见图2。图2属性页/配置属性/链接器/输入/附加依赖性,填入libmyadd2.lib mclmcrrt.lib mclmcr.lib(三个库间有回车),见图3。图3还有其他的一些包含lib,比如libmex.lib、libmx.lib,这里没填,如果在自己的电脑上不行的话,可以加上以上lib。在VC 6上好像要加入这2个lib,自己可以测试一下。以上的配置已经完成,下面就可以进行调用了。3.3 调用测试在VC里新建一个cpp文件,名字为matlabDLL2。这段代码是从别处拷来的,是一段完整代码,将它粘到matlabDLL2.cpp 主CPP文件中,调试通过:/#include stdafx.h#include #include mclmcr.h#include mclcppclass.h#include libmyadd2.hint _tmain(int argc, char* argv)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 libif( !libmyadd2Initialize()std:cout Could not initialize libmyadd2! std:endl;return -1;try/ declare and initialize amwArray a(2, 2, mxDOUBLE_CLASS);double *aData;aData = new double4;int i;for( i=0; i4; +i)aDatai = 1.0*i;/ print outputstd:cout a = std:endl;std:cout aData0 ,/t aData1 std:endl;std:cout aData2 ,/t aData3 std:endl;a.SetData(aData, 4);/ declare and initialize bmwArray b(2, 2, mxDOUBLE_CLASS);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 functionmyadd2(2, y, z, a, b);/ copy data from mwArray to C+ objects/ allocate outputsdouble *yData, *zData;yData = new double4;if( yData = NULL )std:cout Failed 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 outputstd:cout y = std:endl;std:cout yData0 ,/t yData1 std:endl;std:cout yData2 ,/t yData3 std:endl;std:cout z = std:endl;std:cout zData0 ,/t zData1 std:endl;std:cout zData2 ,/t zData3 std:endl;/ deallocate memorydelete aData;delete zData;delete yData;catch( const mwException& e)std:cerr e.what() std:endl;/ terminate the liblibmyadd2Terminate();/ terminate MCRmclTerminateApplication();return 0;/运行结果见图4。图44 C与Matlab之间的数据接口4.1 mwArray类型1复数数组的初始化double rdata4 = 1.0, 2.0, 3.0, 4.0;double idata4 = 10.0, 20.0, 30.0, 40.0;mwArray a(2, 2, mxDOUBLE_CLASS, mxCOMPLEX);a.Real().SetData(rdata, 4);a.Imag().SetData(idata, 4);对应从mwArray中获取元素a.Real().GetData(buffer,len);a.Imag().GetData(buffer,len);2cell元组阵列的获取由于mwArray索引运算符()直接返回mwArray类型,因此可以直接声明通过索引获取元组内的矩阵值。如:a=1,2,1 2;3 4;1 3;2 4,1,2;mwArray b=a(2); /b=1 3;2 4;mwArray c=a(5); /c=1 2;3 4;注:mwArray中数组为按列排,因此1 3;2 4的索引号为23mwArray成员函数使用int NumberOfDimensions返回矩阵维数int NumberOfElements返回矩阵元素个数mwArray GetDimensions返回一维矩阵,表示矩阵各维大小bool IsComplex判断是否复数矩阵注:用GetData前可先使用NumberOfElements确定元素个数,避免越界。4字符串转换为mwArraychar str=inFile.mat;mwArray inFile(str);则inFile则可以直接作为函数的输入参数进行传递。4.2调用函数参数说明例如在上面的加法例子中,myadd2(2, y, z, a, b);参数列表中,

温馨提示

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

评论

0/150

提交评论