VC与MATLAB接口编程方法与实现

上传人:xuex****hao 文档编号:166519384 上传时间:2022-11-01 格式:DOC 页数:14 大小:29.50KB
收藏 版权申诉 举报 下载
VC与MATLAB接口编程方法与实现_第1页
第1页 / 共14页
VC与MATLAB接口编程方法与实现_第2页
第2页 / 共14页
VC与MATLAB接口编程方法与实现_第3页
第3页 / 共14页
资源描述:

《VC与MATLAB接口编程方法与实现》由会员分享,可在线阅读,更多相关《VC与MATLAB接口编程方法与实现(14页珍藏版)》请在装配图网上搜索。

1、VC+与MATLAB接口编程方法与实现 摘 要 本文简介了VC+和MATLAB特点,探讨了MATLAB与VC+接口编程的三种方法,并详细论述了MCC和COM组件接口编程的方法和实现过程。研究表明:采用VC+和MATLAB 接口编程方法降低了编程难度,较好地发挥了两者各自的优势。 关键词 MATLAB;VC+;MCC;COM;接口编程 MATLAB是美国MathWorks公司研制开发的一种科学计算软件,它将高性能的数值计算、符号计算和可视化集成在一起,并提供了大量的内置函数以及功能丰富的工具箱,使用方便,编程效率高。然而,MATLAB是一种解释性语言,运行效率低,不适合作为通用的编程平台。 VC

2、+是Microsoft公司推出的一个基于Windows平台的可视化的集成开发环境,在运行速度、功能性以及应用程序界面开发方面功能强大,但在数值计算和图形绘制方面,VC+并不具备太多优势。因此,采用MATLAB进行核心程序的开发,用VC+制作出友好的程序界面,然后将两者结合起来,可以较大地提高编程效率。1VC+与MATLAB接口方法概述1.1MATLAB引擎方式 MATLAB引擎采用客户机/服务器(Client/Server) 的方式,提供了一组MATAB API函数,通过调用这些函数实现以用程序进程之间的数据传递。在运用中,让VC+程序作为前端客户机,它向MATLAB引擎传递命令和数据,并从M

3、ATLAB引擎接受数据信息,实现动态通讯。1.2MATLAB编译器(MCC) MCC是MATLAB中经过优化的编译器。使用MCC,用户可以将MATLAB数学库、图形库和界面的MATLAB程序转化为独立于MATLAB的EXE应用程序和DLL动态连接库,在VC中编写程序界面并加载调用动态连接库,实现两者之间的连接。1.3COM组件 组件对象模型(简称MCR)是以组件为发布单元的对象模型。它提供一种可以共享二进制代码的工业标准,允许任何符合标准的程序访问,所以COM作为不同语言之间的协作开发是非常方便的。MATLAB的COM编译器是在MATLAB6.5中才开始提供的一个新工具,从MATLAB7.0起

4、,这个产品改名为MATLAB Builder for COM。基于COM的混合编程方法也是Mathworks公司推荐使用的方法。 以上三种方法中,采用MATLAB引擎方式,应用程序整体性能好,MATLAB引擎支持功能全面,但需要MATLAB后台运行,不能脱离MALAB环境。而MCC方法和COM组件方法均可以脱离MATLAB环境,应用程序运行效率高,利于软件的开发,本文将重点论述MCC和COM组件方法。2MATLAB编译器(MCC)2.1MATLAB与VC+接口配置 采用MCC方法需要对MATLAB和VC+接口设置,配置步骤如下: 1) MATLAB编译器配置 首先在MATLAB命令提示符下输入

5、mbuild-setup 命令,选择编译器,(需要注意的是必须确保计算机上已经安装了某个版本的VC+,本文选择visual C+6.0)完成编译器设置。 2) VC+环境设置 (1)设定头文件和库文件路径。在VC+环境菜单栏中选择Tools->Options->Directories,在“Show directories for”栏中首先选择Include files,然后在“directories”中将<matlab7.0安装目>ExternLibWin32 Microsoft MSVC+60添加进去。再次在“Show directories for”栏中选择Libr

6、arys files,再在“directories”中添加<matlab7.0安装目录>ExternInclude。 (2)设置编译连接选项。在VC+环境菜单栏中选择Project ->setting,然后选择link选项卡,在object/library modules栏中添加mclmcrrt.lib libtest.lib;选择General选项卡,在Microsoft Foundation Classes栏中选择Use MFC in a Shared Library。2.2实例演示 完成MATLAB和VC+的接口设置以后,就可以实现MATLAB和VC+的接口编程,具体步

7、骤如下: 1) 编写M函数文件“mypascal.m” function m=mypascal(n) m=pascal(n); m=m; 示例M函数文件的作用是生成一个n阶的帕斯卡矩阵并返回,Pascal矩阵特点:第一行和第一列的元素均为1,其他位置的元素是前方的元素和上方的元素之和。需要注意的是:由于MATLAB中矩阵存储方式是以矩阵的列为先,也就是数据从第一列开始逐列存储的,而C/C+中矩阵则是以第一行开始逐渐存储的,因此在函数的最后一行对返回矩阵取转置运算,等效于使得计算得到的矩阵数据以行模式存储。 2) 编译M文件 在MATLAB命令行输入mcc-B csharedlib:libtes

8、t mypascal.m-v命令(或mcc-W lib:libtest-T link:lib mypascal.m)将m文件编译成C共享动态链接库文件。命令执行完毕后,在当前目录中生成C头文件 (libtest .h) 、引入库文件 (libtest.lib) 、ctf(libtest.ctf) 文件、动态链接库文件 (libtest.dll) 、C源文件 (libtest.c)等8个文件。 3) 创建工程对话框 运行visual C+创建一个对话框工程,取名为test,接受所有默认的设置。去掉对话框上的静态文本和按钮,增加一个按钮、一个静态文本框、编辑框以及一个List Control,鼠标

9、右键单击List Control,选择Properties,把View改成Report,对话框界面如图1所示。给List Control控件添加ClistCtrl类的对象m_List,给编辑框关联一个整型成员变量m_size,给按钮增加一个消息响应函数。图 1 4) 添加编译文件到工程 将mcc编译生成的“libtest.h”、“libtest.dll”、“libtest.lib”,“libtest.ctf”四个文件复制到工程目录,将libtest.h加入工程,并在对话框程序文件“testDlg.cpp”中添加头文件“libtest.h”。 5) VC+中调用动态连接库 在OnInitDial

10、og()函数中添加初始化libtest.dll进程的码:BOOL CTestDlg:OnInitDialog() CDialog:OnInitDialog(); / TODO: Add extra initialization here if (!mclInitializeApplication(NULL,0) AfxMessageBox(不能初始化程序!);exit(1); if (!libtestInitialize() AfxMessageBox(不能初始化连接库!);exit(1); return TRUE; / return TRUE unless you set the focus

11、 to a control 在void CTestDlg:OnCreatebuttom()函数中添加以下代码,实现对mypascal.m的调用,并将计算结果显示在对话框界面中。void CTestDlg:OnCreatebuttom() / TODO: Add your control notification handler code hereUpdateData(TRUE);double data;data=double(m_size);mxArray *size; /输入参数mxArray *out=NULL; /输出参数/创建mxArray数据对象,双精度标量size=mxCreate

12、DoubleScalar(data);/内存复制赋值memcpy(mxGetPr(size),&data,1*sizeof(double); mlfMypascal(1,&out,size);/函数调用/结果数据显示CString strtext;int i,j;/清除已显示的数据m_List.DeleteAllItems();intncolumn=m_List.GetHeaderCtrl()->GetItemCount();for (i=0;i<ncolumn;i+) m_List.DeleteColumn(0); /设置标题栏m_List.InsertColum

13、n(0, );/附空值m_List.SetColumnWidth(0,60);/设置每栏宽度for (i=0;i<m_size;i+) strtext.Format(Column %d,i+1); m_List.InsertColumn(i+1,strtext); m_List.SetColumnWidth(i+1,60); /显示结果数据for (i=0;i<m_size;i+) strtext.Format(Row %d,i+1); m_List.InsertItem(i+1,strtext); for(j=0;j<m_size;j+) strtext.Format(%.

14、f,*(mxGetPr(out)+i*m_size+j);m_List.SetItemText(i,j+1,strtext); mxDestroyArray(size);/数据内存释放mxDestroyArray(out); 利用ClassWizard为对话框添加OnDestroy()函数,并添加以下代码:void CTestDlg:OnDestroy() CDialog:OnDestroy(); / TODO: Add your message handler code her libtestTerminate();/终止进程 mclTerminateApplication();/终止MCR

15、 在VC+中编译、运行结果如图2所示,与在MATLAB中运行M文件的结果一样。图2 6) 独立应用程序的发布发布独立的应用程序时,需要拷贝以下几个文件到目标机器上:MCRInstaller.exe,这个文件位于<matlab7.0安装目录>tool-boxcompilerdeploy win32目录之下,应用程序运行前要先点击运行MCRInstaller.exe文件,按照提示步骤安装好MCR,然后将工程文件的可执行程序(.exe)、共享库(.dll)以及其对应的ctf文件复制到目标计算机即可独立运行。3 COM组件3.1 MATLAB里创建COM组件 使用COM组件方法首先需要在M

16、ATLAB中创建COM组件,步骤如下: 1) 创建COM组件 在MATLAB命令窗口输入命令comtool,打开Matlab Builder对话框,它是Matlab builder for com的主要工作环境。点击File->New Project,会弹出一个新工程设置对话框,填入组件名和类名,完成之后点OK,完成新工程的创建。如果选择的工程所在目录并不存在,comtool会提示该目录不存在,并询问是否创建该目录,选择Yes,comtool就会创建工程到该目录。 2) 添加M文件到组件 执行完第一步后回到matlab builder界面。点击刚才创建的工程,单击Add files按钮,

17、将M文件添加到新建的组件类中。然后点击Build->COM Object编译当前工程的COM组件,这个步骤不仅编译了COM组件,同时也在计算机上注册了该组件,它可以像其他COM组件一样在VC+中使用。编译完成以后在用户设置的项目目录下将产生两个子文件夹src和distrib,src里包含组件的源代码,distrib里包含供用户最终发布使用的COM组件。 3) 打包组件及MCR 编译结束后产生的COM组件只能在当前计算机上使用,为了能够把它发布到其他计算机上使用,还需要其他一些支持文件。另外,COM组件不同于普通的DLL文件,COM组件必须注册后才能在计算机上使用。选择Component-

18、>package component命令,comtool将会把发布该组件所需要的所有文件打包到一个和工程同名的可执行文件中。这里可以选择是否在打包文件中包含MCR。MATLAB7.0产生的COM组件必须运行在MCR环境。如果目标计算机上没有安装MCR,那么在打包组件的时候最好选择包含MCR,这样在打包文件中就会包含MCR的安装文件。打包完成后将会在distrib中产生.exe的可执行文件,这是一个可以自解压的压缩文件。其中包含4个文件:_install.bat,dll文件,ctf文件,MCRInstaller.exe。把产生的.exe文件复制到需要发布的计算机上运行。结果将会把这四个文件

19、解压,并执行_install.bat,这是一个DOS批处理文件,查看_install.bat的内容后可以发现_install.bat将会运行MCRInstaller.exe来安装MCR,并且在系统中注册组件文件。3.2 实例演示 这里仍旧采用上例“mypascal.m”文件,按照3.1介绍的步骤创建COM组件,组件名取Tpascal,类名取Tpascalclass。运行visual C+创建一个与上例一样对话框工程,对话框设置也与上例一样。然后在MFC工程中进行如下操作: 1) 导入DLL文件 将distrib文件夹里Tpascal_1_0.dll拷贝到工程文件夹,然后用VC+命令#impor

20、t来把Tpascal_1_0.dll导入工程中,#import命令的作用是从Tpascal_1_0.dll中导入组件中的接口类型定义,具体做法是在stdafx.h里,加入下面两行:#import Tpascal_1_0.dll raw_interfaces_onlyusing namespace Tpascal; 2) 为工程对话框添加实现代码 在对话框按钮消息响应函数中编写调用组件代码:void CTestDlg:OnCreatebutton() / TODO: Add your control notification handler code hereUpdateData(TRUE);C

21、oInitialize(NULL); /初始化COM/得到COM对象的CLSID CLSID clsid;HRESULT hr;hr=CLSIDFromProgID(OLESTR(Tpascal.Tpascalclass.1_0),&clsid);/创建一个COM对象的实例ITpascalclass *pIpascal; hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_ SERVER,_uuidof(ITpascalclass),(LPVOID *) &pIpascal);if (FAILED(hr)/测试创建是否成功 AfxMessa

22、geBox(create failed);return;/初始化VARIANT变量VARIANT size,out;VariantInit(&size);VariantInit(&out);/创建size,类型为VT_R8,即double型size.vt=VT_R8;size.dblVal=(double)m_size;/创建二维数组out,类型为VT_ARRAY,ARRAY中的元素为double型out.vt=VT_ARRAY|VT_R8;SAFEARRAYBOUND bound2;/设置第一维数组元素个数、元素索引下界bound0.cElements=m_size;boun

23、d0.lLbound=0;/设置第二维数组元素个数、元素索引下界bound1.cElements=m_size;bound1.lLbound=0; out.parray=SafeArrayCreate(VT_R8,2,bound);pIpascal->mypascal(1,&out,size); /函数调用/返回值传递double *matrix,* pDest;matrix=new doublem_size*m_size;SafeArrayAccessData(out.parray,(void*)&pDest);/获得数据指针,访问数据memcpy(matrix,pDe

24、st,m_size*m_size*sizeof(double);/ 拷贝数据矩阵SafeArrayUnaccessData(out.parray);/释放数据指针,取消访问SafeArrayDestroy(out.parray); /释放数组/结果数据显示的代码与上例一样,此处省略delete matrix; /释放指针pIpascal->Release();if(pIpascal!=NULL) pIpascal = NULL;VariantClear(&size);/清空变量VariantClear(&out);CoUninitialize();/释放COM 在VC+中

25、编译、运行结果与上例一样,也与在MATLAB中运行M文件的结果一致。 3) 独立程序的发布 采用COM组件的方法的独立程序的发布,除了需要在目标计算机上运行打包组件产生的可执行文件Tpascal.exe,安装MCRInstaller.exe,并注册Tpascal_1_0.dll以外。还需要将MFC工程的可执行文件.exe拷贝到目标计算机上运行即可实现独立程序的发布。4 结束语 在软件开发过程中,为了提高软件的开发效率,接口编程是综合使用多种开发工具技术优势的一种常用手段。本文采用基于MCC和COM组件的VC+与MATLAB接口编程方法,具有实现简单、执行效率高、几乎支持所有的MATLAB函数、易于移植等优点,是解决矩阵处理、计算以及图像处理编程的一种有效途径,可以为科学研究和工程技术提供更强的技术支持。本文所有代码在环境为Windows XP、MATLAB 7.0.1、VC+6.0下均调试通过。参考文献1 苏金明. MATLAB高级编程M. 北京:电子工业出版社,2005.215-2202 董维国. 深入浅出MATLAB 7.x混合编程M.北京: 机械工业出版社,2006.278-2853 张威.MATLAB应用程序集成与发布M.西安:西安电子科技大学出版社,2005.186-198

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!