《2022年MATLAB和C语言混合编程 .pdf》由会员分享,可在线阅读,更多相关《2022年MATLAB和C语言混合编程 .pdf(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、MATLAB和 C语言混合编程1、mcc4.0 编译环境设置在桌面上右键单击“我的电脑”图标出现以下菜单单击“属性”菜单项,出现“系统特性”对话框,单击“高级”选项卡,如下图所示在上图中,单击“环境变量”按钮,出现“环境变量”对话框,添加系统变量matlab 值为 C:MATLAB7 即 matlab7.0 的安装路径,如下图所示名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 16 页 -在环境变量path 中加入C:MATLAB7binwin32,如下图所示按“确定”完成设置后,重启计算机或注销当前用户,即可应用新设置Matlab7.0 编译器设置(1)mex 命令设置名师资料
2、总结-精品资料欢迎下载-名师精心整理-第 2 页,共 16 页 -(a)运行Matlab,在Matlab 的命令窗口(Command Window)键入“mex-setup”命令后,按回车键,安装Matlab 编译器;(b)命令窗口出现如下提示:Please choose your compiler for building external interface(MEX)files:Would you like mex to locate installed compilers y/n?此时键入”y”,按回车;(c)命令窗口出现如下提示:Please choose your compiler
3、for building external interface(MEX)files:Would you like mex to locate installed compilers y/n?y Select a compiler:1 Digital Visual Fortran version 6.0 in C:Program FilesMicrosoft Visual Studio 2 Lcc C version 2.4 in C:MATLAB6P5syslcc 3 Microsoft Visual C/C+version 6.0 in C:Program FilesMicrosoft Vi
4、sual Studio 0 None 此时键入”3”,按回车;选择Microsoft Visual C+6.0 的编译器(d)命令窗口出现如下提示:Please verify your choices:Compiler:Microsoft Visual C/C+6.0 Location:C:Program FilesMicrosoft Visual Studio Are these correct?(y/n):此时键入”y”,按回车;确认选择Microsoft Visual C+6.0 的编译器(2)mbuild 命令设置(a)运行Matlab,在Matlab 的命令窗口(Command Wi
5、ndow)键入“mbuild-setup”命名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 16 页 -令后,按回车键,安装Matlab 编译器;(b)命令窗口出现如下提示:Please choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers y/n?此时键入”y”,按回车;(c)命令窗口出现如下提示:1 Lcc C version 2.4 in C:MATLAB6P5syslcc 2 Microsoft
6、 Visual C/C+version 6.0 in C:Program FilesMicrosoft Visual Studio 0 None 此时键入”2”,按回车;选择Microsoft Visual C+6.0 的编译器(d)命令窗口出现如下提示:Please verify your choices:Compiler:Microsoft Visual C/C+6.0 Location:C:Program FilesMicrosoft Visual Studio Are these correct?(y/n):此时键入”y”,按回车,确认选择Microsoft Visual C+6.0
7、的编译器,编译器设置完成。3、编写Matlab 函数函数文件sum_prod.m,内容如下:function sum,prod=sum_prod(p1,p2)sum=p1+p2;%p1 与 p2 的和prod=p1.*p2;%p1 与 p2 的点乘该函数完成的是矩阵的求和与点乘的功能,下面将介绍把该代码转换成VC+环境可用的代码的方法。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 16 页 -4、将Matlab 函数转成DLL 函数在 Matlab7.0 的 Command Window 下输入命令:命令1:mcc-W lib:libsum_prod-T link:lib su
8、m_prod.m%26ndash;v 或命令2:mcc-W cpplib:libsum_prod-T link:lib sum_prod.m%26ndash;v 生成动态链接库DLL,编译完成后,Matlab 生成一些文件,其中libsum_prod.ctf libsum_prod.dll libsum_prod.h libsum_prod.lib 这些文件是我们后面需要用到的。特别注意:命令1 生成的DLL 函数接口的数据类型是mxArray,命令 2 生成的DLL 函数接口的数据类型是mwArray。5、VC+6.0 工程的创建与设置(1)建立一个名为Test 的 C+控制台工程,在工程中
9、添加一个名为Test.cpp 文件(2)对 VC 6.0,进行以下设置单击菜单Tools,出现如下菜单名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 16 页 -单击Options,菜单项,出现Options 对话框,选择Directories 标签,在include files 里面加入:C:MATLAB7EXTERNINCLUDE 如下图所示在 Library files 里面加入:C:MATLAB7EXTERNLIBWIN32MICROSOFTMSVC60 如下图所示名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 16 页 -(3)对该工程,进行以下设置单击菜
10、单Project,出现如下菜单单击Setting,菜单项,出现Project Setting 对话框,选择Link 标签,在Object/library modules:下面的文本框内容的后面加入mclmcrrt.lib libsum_prod.lib,如下图所示名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 16 页 -6、代码编辑及DLL 调用(1)将前面生成的四个文件:libsum_prod.ctf libsum_prod.dll libsum_prod.h libsum_prod.lib 复制到VC 工程所在目录。(2)在 VC 6.0 环境中,单击菜单Project,选
11、择Add to Project 菜单项,再单击Files,子菜单项,出现如下图对话框,名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 16 页 -将 libsum_prod.h 加入到当前工程中。(3)当用命令1 生成的DLL 函数时,在工程文件Test.cpp 中添加以下代码:#include iostream.h/输入输出头文件#include mclmcr.h/mxArray 类型声明#include libsum_prod.h/DLL 头文件void display(const mxArray*in,const char*name);int main()/初始化程序if(
12、!mclInitializeApplication(NULL,0)fprintf(stderr,Could not initialize the application.n);exit(1);名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 16 页 -/初始化库if(!libsum_prodInitialize()fprintf(stderr,Could not initialize the library.n);exit(1);/声明DLL 函数输入输出mxArray 对象mxArray*X,*Y;mxArray*SUM=NULL,*PROD=NULL;/给输入mxArray
13、对象分配内存X=mxCreateDoubleMatrix(2,3,mxREAL);Y=mxCreateDoubleMatrix(2,3,mxREAL);double x=1,2,3,4,5,6;double y=7,8,9,10,11,12;/给输入mxArray 对象赋值memcpy(mxGetPr(X),x,6*sizeof(double);memcpy(mxGetPr(Y),y,6*sizeof(double);/调用DLL 函数,注意输入与输出的接口是不同的mlfSum_prod(2,%26amp;SUM,%26amp;PROD,X,Y);名师资料总结-精品资料欢迎下载-名师精心整理-
14、第 10 页,共 16 页 -/显示mxArray 对象display(SUM,SUM);display(PROD,PROD);/释放输入输出mxArray 对象所占用的内存/注意输出对象的内存是在调用DLL 函数过程中分配的mxDestroyArray(X);mxDestroyArray(Y);mxDestroyArray(SUM);mxDestroyArray(PROD);/关闭库和程序libsum_prodTerminate();mclTerminateApplication();return 0;/显示矩阵函数void display(const mxArray*in,const ch
15、ar*name)int i,j,r,c;double*data;data=mxGetPr(in);名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 16 页 -r=mxGetM(in);c=mxGetN(in);printf(%s=n,name);for(i=0;i%26lt;r;i+)printf(t);for(j=0;j%26lt;c;j+)printf(%4.2f t,dataj*r+i);printf(n);printf(n);该 C+程序运算结果如下图所示(4)当用命令2 生成的DLL 函数时,在工程文件Test.cpp 中添加以下代码:#include iostrea
16、m.h/输入输出头文件#include mclmcr.h/mwArray 类型声明#include libsum_prod.h/DLL 头文件名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 16 页 -void display(const double*data,const int r,const int c,const char*name);int main()/初始化程序if(!mclInitializeApplication(NULL,0)fprintf(stderr,Could not initialize the application.n);exit(1);/初始化
17、库if(!libsum_prodInitialize()fprintf(stderr,Could not initialize the library.n);exit(1);/声明DLL 函数输入输出mwArray 对象mwArray X(2,3,mxDOUBLE_CLASS);mwArray Y(2,3,mxDOUBLE_CLASS);mwArray SUM,PROD;double x=1,2,3,4,5,6;名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 16 页 -double y=7,8,9,10,11,12;double*sum,*prod;sum=new doubl
18、e6;prod=new double6;/给输入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:cout%26lt;%26lt;SUM=%26lt;%26lt;std:endl%26lt;%26lt;SUM%26lt;%26lt;std:endl;/std:cout%26lt;%26lt;PROD=%26lt;%26lt;std:endl%26lt;%26lt;P
19、ROD%26lt;%26lt;std:endl;display(sum,2,3,SUM);display(prod,2,3,PROD);delete sum;名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 16 页 -delete prod;/关闭库和程序libsum_prodTerminate();mclTerminateApplication();return 0;/显示矩阵函数void display(const double*data,const int r,const int c,const char*name)int i,j;printf(%s=n,name);fo
20、r(i=0;i%26lt;r;i+)printf(t);for(j=0;j%26lt;c;j+)printf(%4.2f t,dataj*r+i);printf(n);printf(n);该 C+程序运算结果如下图所示名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 16 页 -特别说明:在 CC+环境中二维数组是“行向量”,如果将下面定义的变量x 看成二维数组的话double x=1,2,3,4,5,6;那么x 应该是的矩阵,即x=1,2,3;4,5,6;但是,如果将数组首地址x 初始化mxArray 和 mwArray 类时,数组x 在mxArray 和mwArray 类中是按“列向量”的形式排列的,即X=1,3,5;2,4,6;同理,这里Y=7,9,11;8,10,12;因此才能得到上图的结果本 文 来 自:高 校 自 动 化 网(W)详 细 出 处 参 考(转 载 请 保 留 本 链 接):http:/ 名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 16 页 -