您好,欢迎访问三七文档
将Matlab7.0函数转换成VC++6.0动态链接库[转]VC与Matlab混合编2010-10-1119:15:10阅读152评论0字号:大中小订阅本文引用自1muliwei《Matlab7.0函数转换成VC++6.0动态链接库[转+修改]》引用1muliwei的Matlab7.0函数转换成VC++6.0动态链接库[转+修改]1、mcc4.0编译环境设置在桌面上右键单击“我的电脑”图标出现以下菜单单击“属性”菜单项,出现“系统特性”对话框,单击“高级”选项卡,如下图所示在上图中,单击“环境变量”按钮,出现“环境变量”对话框,添加系统变量matlab值为C:\MATLAB7即matlab7.0的安装路径,如下图所示在环境变量path中加入C:\MATLAB7\bin\win32,如下图所示按“确定”完成设置后,重启计算机或注销当前用户,即可应用新设置。2、Matlab7.0编译器设置(1)mex命令设置(a)运行Matlab,在Matlab的命令窗口(CommandWindow)键入“mex-setup”命令后,按回车键,安装Matlab编译器;(b)命令窗口出现如下提示:Pleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikemextolocateinstalledcompilers[y]/n?此时键入”y”,按回车;(c)命令窗口出现如下提示:Pleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikemextolocateinstalledcompilers[y]/n?ySelectacompiler:[1]DigitalVisualFortranversion6.0inC:\ProgramFiles\MicrosoftVisualStudio[2]LccCversion2.4inC:\MATLAB6P5\sys\lcc[3]MicrosoftVisualC/C++version6.0inC:\ProgramFiles\MicrosoftVisualStudio[0]None此时键入”3”,按回车;选择MicrosoftVisualC++6.0的编译器(d)命令窗口出现如下提示:Pleaseverifyyourchoices:Compiler:MicrosoftVisualC/C++6.0Location:C:\ProgramFiles\MicrosoftVisualStudioArethesecorrect?([y]/n):此时键入”y”,按回车;确认选择MicrosoftVisualC++6.0的编译器(2)mbuild命令设置(a)运行Matlab,在Matlab的命令窗口(CommandWindow)键入“mbuild-setup”命令后,按回车键,安装Matlab编译器;(b)命令窗口出现如下提示:PleasechooseyourcompilerforbuildingstandaloneMATLABapplications:Wouldyoulikembuildtolocateinstalledcompilers[y]/n?此时键入”y”,按回车;(c)命令窗口出现如下提示:[1]LccCversion2.4inC:\MATLAB6P5\sys\lcc[2]MicrosoftVisualC/C++version6.0inC:\ProgramFiles\MicrosoftVisualStudio[0]None此时键入”2”,按回车;选择MicrosoftVisualC++6.0的编译器(d)命令窗口出现如下提示:Pleaseverifyyourchoices:Compiler:MicrosoftVisualC/C++6.0Location:C:\ProgramFiles\MicrosoftVisualStudioArethesecorrect?([y]/n):此时键入”y”,按回车,确认选择MicrosoftVisualC++6.0的编译器,编译器设置完成。3、编写Matlab函数函数文件sum_prod.m,内容如下:function[sum,prod]=sum_prod(p1,p2)sum=p1+p2;%p1与p2的和prod=p1.*p2;%p1与p2的点乘该函数完成的是矩阵的求和与点乘的功能,下面将介绍把该代码转换成VC++环境可用的代码的方法。4、将Matlab函数转成DLL函数在Matlab7.0的CommandWindow下输入命令:命令1:mcc-Wlib:libsum_prod-Tlink:libsum_prod.m或命令2:mcc-Wcpplib:libsum_prod-Tlink:libsum_prod.m生成动态链接库DLL,编译完成后,Matlab生成一些文件,其中libsum_prod.ctflibsum_prod.dlllibsum_prod.hlibsum_prod.lib这些文件是我们后面需要用到的。特别注意:命令1生成的DLL函数接口的数据类型是mxArray,命令2生成的DLL函数接口的数据类型是mwArray。5、VC++6.0工程的创建与设置(1)建立一个名为Test的C++控制台工程,在工程中添加一个名为Test.cpp文件(2)对VC++6.0,进行以下设置单击菜单Tools,出现如下菜单单击Options…菜单项,出现Options对话框,选择Directories标签,在includefiles里面加入:C:\MATLAB7\EXTERN\INCLUDE如下图所示在Libraryfiles里面加入:C:\MATLAB7\EXTERN\LIB\WIN32\MICROSOFT\MSVC60如下图所示(3)对该工程,进行以下设置单击菜单Project,出现如下菜单单击Setting…菜单项,出现ProjectSetting对话框,选择Link标签,在Object/librarymodules:下面的文本框内容的后面加入mclmcrrt.liblibsum_prod.lib,如下图所示6、代码编辑及DLL调用(1)将前面生成的四个文件:libsum_prod.ctflibsum_prod.dlllibsum_prod.hlibsum_prod.lib复制到VC工程所在目录。(2)在VC++6.0环境中,单击菜单Project,选择AddtoProject菜单项,再单击Files…子菜单项,出现如下图对话框,将libsum_prod.h加入到当前工程中。3)当用命令1生成的DLL函数时,在工程文件Test.cpp中添加以下代码:#includeiostream.h//输入输出头文件#includemclmcr.h//mxArray类型声明#includelibsum_prod.h//DLL头文件voiddisplay(constmxArray*in,constchar*name);intmain(){//初始化程序if(!mclInitializeApplication(NULL,0)){fprintf(stderr,Couldnotinitializetheapplication.\n);exit(1);}//初始化库if(!libsum_prodInitialize()){fprintf(stderr,Couldnotinitializethelibrary.\n);exit(1);}//声明DLL函数输入输出mxArray对象mxArray*X,*Y;mxArray*SUM=NULL,*PROD=NULL;//给输入mxArray对象分配内存X=mxCreateDoubleMatrix(2,3,mxREAL);Y=mxCreateDoubleMatrix(2,3,mxREAL);doublex[]={1,2,3,4,5,6};doubley[]={7,8,9,10,11,12};//给输入mxArray对象赋值memcpy(mxGetPr(X),x,6*sizeof(double));//来源:()-Matlab7.0函数转换成VC++6.0动态链接库[转]_wind_新浪博客memcpy(mxGetPr(Y),y,6*sizeof(double));//调用DLL函数,注意输入与输出的接口是不同的mlfSum_prod(2,&SUM,&PROD,X,Y);//显示mxArray对象display(SUM,SUM);display(PROD,PROD);//释放输入输出mxArray对象所占用的内存//注意输出对象的内存是在调用DLL函数过程中分配的mxDestroyArray(X);mxDestroyArray(Y);mxDestroyArray(SUM);mxDestroyArray(PROD);//关闭库和程序libsum_prodTerminate();mclTerminateApplication();return0;}//显示矩阵函数voiddisplay(constmxArray*in,constchar*name){inti,j,r,c;double*data;data=mxGetPr(in);r=mxGetM(in);c=mxGetN(in);printf(%s=\n,name);for(i=0;ir;i++){printf(\t);for(j=0;jc;j++)printf(%4.2f\t,data[j*r+i]);printf(\n);}printf(\n);}该C++程序运算结果如下图所示(4)当用命令2生成的DLL函数时,在工程文件Test.cpp中添加以下代码:#includeiostream.h//输入输出头文件#includemclmcr.h//mwArray类型声明#includelibsum_prod.h//DLL头文件voiddisplay(constdouble*data,constintr,constintc,constchar*name);intmain(){//初始化程序if(!mclInitializeApplication(NULL,0)){fprintf(stderr,Couldnotinitializetheapplication.\n);exit(1);}//初始化库if(!libsum_prodInitialize()){fprintf(stderr,Couldnotinitializethelibrary.\n);exit(1);}//声明DLL函数输入输出mwArray对象mwArrayX(2,3,mxDOUBLE_CLASS);mwArrayY(2,3,mxDOUBLE_CLASS);mwArraySUM,PROD;doublex[]={1,2,3,4,5,6};doubley[]={7,8,9,10,11,12};double*sum,*prod;sum=newdouble[6];prod=newdouble[6];//给输入mwArray对象赋值X.SetData(x,6);Y.SetData(y,6);//调用DLL函数sum_prod(2,SUM,PROD,X,Y);//取出输出数据SUM.GetData(sum,6);PROD.GetData(prod,6);//显示mwArray对象//std::coutSUM=std::endlSUMstd::endl;;//std::coutPROD=std::endlPRODstd::endl;;display(sum,2,3,SUM);display(prod,2,3,PROD);deletesum;deletepr
本文标题:Matlab与vc
链接地址:https://www.777doc.com/doc-5097725 .html