VC-与MATLAB接口编程方法与实现_第1页
VC-与MATLAB接口编程方法与实现_第2页
VC-与MATLAB接口编程方法与实现_第3页
VC-与MATLAB接口编程方法与实现_第4页
VC-与MATLAB接口编程方法与实现_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

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

摘要本文简介了VC++和MATLAB特点,

探讨了MATLAB与VC++接口编程的三种方法,

并详细论述了MCC和COM组件接口编程的方

法和实现过程。研究表明:采用VC++和

MATLAB接口编程方法降低了编程难度,较

好地发挥了两者各自的优势。关键词

MATLAB;VC++;MCC;COM;接口编程MATLAB

是美国MathWorks公司研制开发的一种科学

计算软件,它将高性能的数值计算、符号计

算和可视化集成在一起,并提供了大量的内

置函数以及功能丰富的工具箱,使用方便,

编程效率高。然而,MATLAB是一种解释性语

言,运行效率低,不适合作为通用的编程平

台。VC++是Microsoft公司推出的一个基

于Windows平台的可视化的集成开发环境,

在运行速度、功能性以及应用程序界面开发

方面功能强大,但在数值计算和图形绘制方

面,VC++并不具备太多优势。因此,采用

MATLAB进行核心程序的开发,用VC++制作

出友好的程序界面,然后将两者结合起来,

可以较大地提高编程效率。

1VC++与MATLAB接口方法概述

MATLAB引擎方式MATLAB引擎采用客户机

/服务器(Client/server)的方式,提供了

一组MATABAPI函数,通过调用这些函数实

现以用程序进程之间的数据传递。在运用中,

让VC++程序作为前端客户机,它向MATLAB

引擎传递命令和数据,并从MATLAB引擎接

受数据信息,实现动态通讯。

MATLAB编译器MCC是MATLAB中经过优化

的编译器。使用MCC,用户可以将MATLAB数

学库、图形库和界面的MATLAB程序转化为

独立于MATLAB的EXE应用程序和DLL动态

连接库,在VC中编写程序界面并加载调用

动态连接库,实现两者之间的连接。

COM组件组件对象模型是以组件为发布

单元的对象模型。它提供一种可以共享二进

制代码的工业标准,允许任何符合标准的程

序访问,所以COM作为不同语言之间的协作

开发是非常方便的。MATLAB的COM编译器是

在中才开始提供的一个新工具,从起,这个

产品改名为MATLABBuilderforCOM。基于

COM的混合编程方法也是Mathworks公司推

荐使用的方法。以上三种方法中,采用

MATLAB引擎方式,应用程序整体性能好,

MATLAB引擎支持功能全面,但需要MATLAB

后台运行,不能脱离MALAB环境。而MCC方

法和COM组件方法均可以脱离MATLAB环境,

应用程序运行效率高,利于软件的开发,本

文将重点论述MCC和COM组件方法。

2MATLAB编译器

MATLAB与VC++接口配置采用MCC方法需

要对MATLAB和VC++接口设置,配置步骤1)

MATLAB编译器配置首先在MATLAB命令提

示符下输入mbuild-setup命令,选择编译

器,(需要注意的是必须确保计算机上已经

安装了某个版本的VC++,本文选择visual

C++)完成编译器设置。2)VC++环境设置

(1)设定头文件和库文件路径。在VC++环境

菜单栏中选择Tools-Options-Directories,

在"Showdirectoriesfor”栏中首先选择

Includefiles,然后在“directories”中

将安装目

"Extern“Lib”Win32“Microsoft

“MSVC++60添加进去。再次在“Show

directoriesfor”栏中选择Librarys

files,再在“directories”中添加安装目

录“Extern"Include。(2)设置编译连接

选项。在VC++环境菜单栏中选择Project

-setting,然后选择link选项卡,在

object/librarymodules栏中添加;选择

General选项卡,在MicrosoftFoundation

Classes栏中选择UseMFCinaShared

Libraryo

实例演示完成MATLAB和VC++的接口设置

以后,就可以实现MATLAB和VC++的接口编

程,具体步骤1)编写M函数文件"”

functionm=mypascal(n)m=pascal(n);

m=m';示例M函数文件的作用是生成一

个n阶的帕斯卡矩阵并返回,Pascal矩阵特

点:第一行和第一列的元素均为1,其他位

置的元素是前方的元素和上方的元素之和。

需要注意的是:由于MATLAB中矩阵存储方

式是以矩阵的列为先,也就是数据从第一列

开始逐列存储的,而C/C++中矩阵则是以第

一行开始逐渐存储的,因此在函数的最后一

行对返回矩阵取转置运算,等效于使得计算

得到的矩阵数据以行模式存储。2)编译M

文件在MATLAB命令行输入mcc-B

csharedlib:libtest命令(或mcc-Wlib:

libtest-Tlink:lib)将小文件编译成C

共享动态链接库文件。命令执行完毕后,在

当前目录中生成C头文件(libtest.h)、

引入库文件()、ctfO文件、动态链接库

文件()、C源文件()等8个文件。3)创

建工程对话框运行visualC++创建一个对

话框工程,取名为test,接受所有默认的设

置。去掉对话框上的静态文本和按钮,增加

一个按钮、一个静态文本框、编辑框以及一

个ListControl,鼠标右键单击List

Control,选择Properties,把View改成

Report,对话框界面如图1所示。给List

Control控件添加ClistCtrl类的对象

m_List,给编辑框关联一个整型成员变量

m_size,给按钮增加一个消息响应函数。图

14)添加编译文件到工程将nice编译生成

的“,一“”、”,,,“”四个文件复制到

工程目录,将加入工程,并在对话框程序文

件中添加头文件"”。5)VC++中调用

动态连接库①在OnlnitDialogO函数中

添加初始化进程的码:BOOLCTestDlg::

OnlnitDialogO{CDialog::

OnlnitDialogO;//TODO:Addextra

initializationhereif

(!me1InitializeApplication(NULL,0))

{AfxMessageBox(〃不能初始化程序!〃);

exit(1);}if(!libtestInitialize())

{AfxMessageBox(〃不能初始化连接库!〃);

exit(1);}returnTRUE;//returnTRUE

unlessyousetthefocustoacontrol)

②在voidCTestDlg::OnCreatebuttom()

函数中添加以下代码,实现对的调用,并将

计算结果显示在对话框界面中。void

CTestDlg::OnCreatebuttom(){//TODO:

Addyourcontrolnotificationhandler

codehereUpdateData(TRUE);doubledata;

data=double(m_size);mxArray*size;//

输入参数mxArray*out=NULL;〃输出参数

〃创建mxArray数据对象,双精度标量

size=mxCreateDoubleScalar(data);〃内

存复制赋值memcpy(mxGetPr(size),&data,

l*sizeof(double));mlfMypascal(1,

&out,size);〃函数调用〃结果数据显示

CStringstrtext;inti,j;〃清除已显

示的数据m_();

intncolumn=m_()-GetItemCount();for

(i=0;incolumn;i++)m_(0);//设置标

题栏m_(0,〃〃);〃附空值m_(0,60);//

设置每栏宽度for(i=0;im_size;i++)

{("Column%d〃,i+1);strtext);

m_(i+l,60);}〃显示结果数据for(i=0;

im_size;i++){("Row%d〃,i+1);m_(i+l,

strtext);for(j=0;jm_size;j++){(〃%.f〃,

*(mxGetPr(out)+i*m_size+j));m_(i,j+1,

strtext);}JmxDestroyArray(size);//

数据内存释放mxDestroyArray(out);}③

利用ClassWizard为对话框添加OnDestroy()

函数,并添加以下代码:voidCTestDlg::

OnDestroy(){CDialog::OnDestroy();//

TODO:Addyourmessagehandlercodeher

1ibtestTerminate();//终止进程

mclTerminateApplicationO;〃终止MCR)

在VC++中编译、运行结果如图2所示,与在

MATLAB中运行M文件的结果一样。图2

6)独立应用程序的发布发布独立的应

用程序时,需要拷贝以下几个文件到目标机

器上:,这个文件位于安装目录

“tool-boxucompilerudeploy“Win32目

录之下,应用程序运行前要先点击运行文件,

按照提示步骤安装好MCR,然后将T程文件

的可执行程序(.exe)、共享库(.dll)以及其

对应的ctf文件复制到目标计算机即可独立

运行。

3COM组件

MATLAB里创建COM组件使用COM组件方法

首先需要在MATLAB中创建COM组件,步骤1)

创建COM组件在MATLAB命令窗口输入命令

comtooL打开MatlabBuilder对话框,它

是Matlabbuilderforcom的主要工作环

境。点击File-NewProject,会弹出一个新

工程设置对话框,填入组件名和类名,完成

之后点0K,完成新工程的创建。如果选择的

工程所在目录并不存在,comtool会提示该

目录不存在,并询问是否创建该目录,选择

Yes,comtool就会创建工程到该目录。2)

添加M文件到组件执行完第一步后回到

matlabbuilder界面。点击刚才创建的工程,

单击Addfiles按钮,将M文件添加到新建

的组件类中。然后点击Build-COMObject

编译当前工程的COM组件,这个步骤不仅编

译了COM组件,同时也在计算机上注册了该

组件,它可以像其他COM组件一样在VC++

中使用。编译完成以后在用户设置的项目目

录下将产生两个子文件夹src和distrib,

src里包含组件的源代码,distrib里包含

供用户最终发布使用的COM组件。3)打包

组件及MCR编译结束后产生的COM组件只能

在当前计算机上使用,为了能够把它发布到

其他计算机上使用,还需要其他一些支持文

件。另外,COM组件不同于普通的DLL文件,

COM组件必须注册后才能在计算机上使用。

选择Component-packagecomponent命令,

comtool将会把发布该组件所需要的所有文

件打包到一个和工程同名的可执行文件中。

这里可以选择是否在打包文件中包含MCRo

产生的COM组件必须运行在MCR环境。如果

目标计算机上没有安装MCR,那么在打包组

件的时候最好选择包含MCR,这样在打包文

件中就会包含MCR的安装文件。打包完成后

将会在distrib中产生.exe的可执行文件,

这是一个可以自解压的压缩文件。其中包含

4个文件:dll文件,ctf文件,。把产生

的.exe文件复制到需要发布的计算机上运

行。结果将会把这四个文件解压,并执行

这是一个DOS批处理文件,查看一的内容后

可以发现—将会运行来安装MCR,并且在系统

中注册组件文件。

实例演示这里仍旧采用上例“”文件,按

照介绍的步骤创建COM组件,组件名取

Tpascal,类名取Tpascalclass。运行visual

C++创建一个与上例一样对话框工程,对话

框设置也与上例一样。然后在MFC工程中进

行如下操作:1)导入DLL文件将distrib

文件夹里Tpascal」_拷贝到工程文件夹,然

后用VC++命令#import来把Tpascal_l_导入

工程中,#import命令的作用是从

Tpascal_l_中导入组件中的接口类型定义,

具体做法是在里,加入下面两行:^import

/zTpascal_l_/zraw_interfaces_onlyusing

namespaceTpascal;2)为工程对话框添

加实现代码在对话框按钮消息响应函数中

编写调用组件代码:voidCTestDlg::

OnCreatebutton(){//TODO:Addyour

controlnotificationhandlercode

hereUpdateData(TRUE);

CoInitialize(NULL);〃初始化COM〃得到

COM对象的CLSIDCLSIDclsid;HRESULThr;

hr=CLSIDFromProgID(OLESTR(〃_0〃),

&clsid);〃创建一个COM对象的实例

ITpascalclass*plpascal;

hr=CoCreateInstance(clsid,NULL,

CLSCTX_INPROC_SERVER,

―uuidof(ITpascalclass),(LPVOID*)

&plpascal);if(FAILED(hr))〃测试创建

是否成功{AfxMessageBox(z,create

failed");return;}//初始化VARIANT变

量VARIANTsize,out;VariantInit(&size);

Variantlnit(&out);〃创建size,类型为

VT_R8,即double型=VT_R8;

=(double)m_size;〃创建二维数组out,类

型为VT_ARRAY,ARRAY中的元素为double

型=VT_ARRAY|VT_R8;SAFEARRAYBOUNDbound;

〃设置第一维数组元素个数、元素索引下界

bound[0].cE1ements=m_size;

bound[0].lLbound=0;//设置第二维数组元

素个数、元素索引下界

bound[1].cElements=m_size;

bound[1].lLbound=0;

=SafeArrayCreate(VT_R8,2,bound);

plpascal-mypascal(1,&out,size);//

函数调用〃返回值传递double"matrix,*

pDest;matrix=newdouble_m_size*m_size];

SafeArrayAccessData(,(void**)&pDest);

〃获得数据指针,访问数据memcpy(matrix,

pDest,msize*msize*sizeof(double));

//拷贝数据矩阵

Sa

温馨提示

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

评论

0/150

提交评论