matlab compiler与c语言混合编程.doc_第1页
matlab compiler与c语言混合编程.doc_第2页
matlab compiler与c语言混合编程.doc_第3页
matlab compiler与c语言混合编程.doc_第4页
全文预览已结束

下载本文档

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

文档简介

matlab compiler与c语言混合编程经过一个多月的努力,在老师的帮助和自己的琢磨之下,终于对vc与matlab的混合编程有所了解。且举一例。 首先要在自己的matlab7.0上安装MEX和mBuilder,安装方法是在matlab命令窗口中输入mex-setup,按照一系列的步骤安装下去。然后再在命令窗口中输入mbuilder-setup,同样的方法就可以安装mbuilder。在matlab中打开一个空的m文件,向里面写下列代码,并将其保存为zhengtaifenbuhanshu.m:function y=zhengtaifenbuhanshu(x,u,d)%x为变量,u为均值,d为方差y=normcdf(x,u,d);我的目的是在c语言中可以调用matlab中的正态分布函数。这个函数有三个输入参数,一个输出参数。然后在matlab命令行中打入:mcc -l zhengtaifenbuhanshu.m -o dllnormcdf。这样就生成c共享(动态)库文件。其中zhengtaifenbuhanshu.m是要编译的m文件,最后编译的名称为dllnormcdf。-o表示要编译成的名字,如果没有-o,则编译后生成的文件名是与第一个要编译的文件名一致,就是这里的zhengtaifenbuhanshu。上面命令的作用是将zhengtaifenbuhanshu.m函数生成名字为dllnormcdf的c语言动态库。注意编译的路径,如果zhengtaifenbuhanshu是你放在一个matlab中work的一个包中,那么matlab主窗口上面的Current Directory要选择好zhengtaifenbuhanshu.m这个m文件所在的地方。按回车编译成功后,你会在编译的文件夹(默认的是work中)中看到多了几个生成的文件:dllnormcdf.cdllnormcdf.ctfdllnormcdf.dlldllnormcdf.expdllnormcdf.exportsdllnormcdf.hdllnormcdf.libdllnormcdf_mcc_component_data.c在生成的文件中,dllnormcdf.h文件是编译结果函数库的函数声明头文件,而dllnormcdf.lib文件是最终用户在编译自己的可执行应用程序所必须的库文件,dllnormcdf.dll文件就是最终用户的可执行应用程序运行时所需要的动态库。dllnormcdf.ctf是压缩文件,内容包含了所有与执行应用程序相关的MATLAB文件,dllnormcdf_mcc_component_data.c是数据文件,它包含了路径信息、MCR信息以及密钥等,dllnormcdf.exports文件中包含了所有被编译函数的声明符号,这些函数的原型都包含在了头文件dllnormcdf.h中。在vc中新建一个工程,这里我是用c语言作为例子的。然后将在matlab中生成的所有文件dllnormcdf.c、dllnormcdf.ctf、dllnormcdf.dll、dllnormcdf.exp、dllnormcdf.exports、dllnormcdf.h、dllnormcdf.lib、dllnormcdf_mcc_component_data.c都拷贝到新建工程的文件夹中。点击vc窗口的FileView,然后右键点击Header Files,选择Add Files to Folder,将刚才拷贝过去的头文件dllnormcdf.h选择后,按ok将其添加进去。这样就看到Header Files中多了一个头文件。双击头文件可以看到如下代码:#ifndef _dllnormcdf_h#define _dllnormcdf_h 1#if defined(_cplusplus) & !defined(mclmcr_h) & defined(_linux_)# pragma implementation mclmcr.h#endif#include mclmcr.h#ifdef _cplusplusextern C #endifextern bool dllnormcdfInitializeWithHandlers(mclOutputHandlerFcn error_handler, mclOutputHandlerFcn print_handler);extern bool dllnormcdfInitialize(void);extern void dllnormcdfTerminate(void);extern void mlxZhengtaifenbuhanshu(int nlhs, mxArray *plhs, int nrhs, mxArray *prhs);extern void mlfZhengtaifenbuhanshu(int nargout, mxArray* y, mxArray* x , mxArray* u, mxArray* d);#ifdef _cplusplus#endif#endif我们关心的是extern void mlfZhengtaifenbuhanshu(int nargout, mxArray* y, mxArray* x, mxArray* u, mxArray* d)这行代码。这表明在用c链接库时,调用matlab中的函数,用的是函数名mlfZhengtaifenbuhanshu,而不是matlab中的zhengtaifenbuhanshu。其中第一个参数int nargout表示的是函数输出参数的个数,第二个参数就是函数的输出参数,而第三、四、五个参数分别是函数的输入的三个参数x ,u,d。然后在c语言空文件中写如下测试代码:#include mclmcr.h#include dllnormcdf.h#include extern void display(const mxArray* in);int main()double x1=1;double u1=0;double d1=2; mxArray *x_ptr;/输入参数 mxArray *u_ptr; /输入参数 mxArray *d_ptr; /输入参数 mxArray *y_ptr=NULL;/输出参数 if(!mclInitializeApplication(NULL,0) fprintf(stderr,could not initialize the application.n);exit(1); /* x_ptr=mxCreateDoubleScalar(x); u_ptr=mxCreateDoubleScalar(u); d_ptr=mxCreateDoubleScalar(d); */ x_ptr=mxCreateDoubleMatrix(1,1,mxREAL); u_ptr=mxCreateDoubleMatrix(1,1,mxREAL); d_ptr=mxCreateDoubleMatrix(1,1,mxREAL); y_ptr=mxCreateDoubleMatrix(1,1,mxREAL); memcpy(mxGetPr(x_ptr),x,1*sizeof(double); memcpy(mxGetPr(u_ptr),u,1*sizeof(double); memcpy(mxGetPr(d_ptr),d,1*sizeof(double); if(!dllnormcdfInitialize() fprintf(stderr,could not initialize the library.n); exit(1); mlfZhengtaifenbuhanshu(1,&y_ptr,x_ptr,u_ptr,d_ptr); printf(nthe result is n); display(y_ptr); mxDestroyArray(y_ptr); y_ptr=0; dllnormcdfTerminate(); mxDestroyArray(x_ptr); mxDestroyArray(u_ptr); mxDestroyArray(d_ptr); mclTerminateApplication(); return 0;#include mclmcr.h#include void display(const mxArray* in) int i=0;int j=0;int r=0;int c=0;double *data;r=mxGetM(in);/得到输入in的行数c=mxGetN(in);/得到输入in的列数行数data=mxGetPr(in); /得到输入in的实部for(i=0;ic;i+)for(j=0;jr;j+) printf(%ft,dataj*c+i);printf(n); printf(n);代码添加后,我们要做一系列的设置。在vc菜单ToolsOptionsDirectoriesShow directories for: include files添加Externinclude.再在ToolsOptionsDirectoriesShow directories for: Library添加ExternLibWin32Microsoftmsvc60。经过上面的设置后。下面添加静态库lib文件与头文件,添加方法如下ProjectSettingLinkCategory: inputObject/library modules 添加 mclmcrrt.lib dllnormcdf.lib。这样Vc6.0和matlab7.0的连接就基本上成功了。如果matlab中是要打开一个文件(如从txt文件读取数据)或是其他,也要把这个文件也拷贝到c的工程下。现在来解释一下测试中的代码作用和意义。mclmcr.h是利用R14(matlab版本号)进行共享库开发都需要的头文件,当然还得必须加入我们上面导入的头文件dllnormcdf.h。这里用输入参数x作为一个例子,首先声明一个x的数组double x1=1,然后声明mxArray *x_ptr,那么x_ptr就是数组类型。这里的mxArray是matlab提供的一个特殊的c语言结构,这个结构就是用来在c语言中表示matlab数据的。为什么要将输入参数x_ptr、u_ptr、 d_ptr设置为数组类型,这是因为在dllnormcdf.h头文件中的代码extern void mlfZhengtaifenbuhanshu(int nargout, mxArray* y, mxArray* x, mxArray* u, mxArray* d),可以看到输入参数x、u、d都是数组类型的。下面就是初始化应用,再就是创建x_ptr=mxCreateDoubleMatrix(1,1,mxREAL)矩阵。memcpy(m

温馨提示

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

评论

0/150

提交评论