【VB开源代码栏目提醒】:网学会员在VB开源代码频道为大家收集整理了“VB程序中实现调用MATLAB的方法 - 计算机教材“提供大家参考,希望对大家有所帮助!
收稿日期:2000207227 作者简介:王跃强1978-男硕士研究生主要研究方向:光电检测及其自动化.文章编号:1001-9081200102-0095-02
VB程序中实现调用MATLAB的方法王跃强王纪龙王云才太原理工大学应用物理系山西太原030024摘 要:本文介绍了在
VB应用程序中利用动态数据交换和ActiveX自动化OLE自动化协议实现的两种调用MATLAB函数的方法。
通过这两种方法实现了
VB的可视化界面与MATLAB强大的数值分析和图形显示的能力的结合。
关键词:MATLABVBDDE客户/服务器中图分类号:TP312
VB 文献标识码:B 通过对MATLAB的应用程序接口的分析可以发现MATLAB提供了客户/服务器Client/Server功能。
利用其中的动态数据交换DDE服务功能和ActiveX自动化OLE自动化服务功能可以实现在
VB中对MATLAB函数的调用并通过mxArraysMATLAB中的基本数据类型与MATLAB工作空间交换数据从而增强
VB的数值计算能力和数据的可视化能力。
下面介绍在
VB程序中调用MATLAB的方法。
1 MATLAB的动态数据交换服务功能动态数据交换DDE是在Windows环境下支持客户/服务器计算模式的重要技术两个Windows应用程序之间可以通过交换数据来相互连接由于
VB支持DDE客户端功能MATLAB提供了DDE服务功能因此利用
VB和MATLAB的动态数据交换能力可以实现在
VB应用程序中调用MATLAB。
VB应用程序首先通过确定服务器名和主题topic建立与MATLAB的DDE会话服务器名和主题唯一地确定了这次会话在会话期间
VB应用程序作为客户端MATLAB作为服务端客户端与服务端可以就确定的项目item交换数据。
关于
VB的DDE功能可以参考文献1本文仅就MATLAB的DDE服务功能做详细介绍
VB应用程序中需指明的MATLAB的服务器名为MatlabMATLAB有System和Engine两个主题在System主题下可以列出MATLAB所提供的详细的DDE功能在Engine主题下可以充分实现MATLAB的服务功能。
利用
VB具有的DDE客户端功能使用MATLAB的Engine主题支持的三种操作
VB应用程序就可以向MATLAB传送可执行的命令从MATLAB中读取数据以及向MATLAB中传送数据。
在Engine主题下含有四个项目:EngEvalStringEngStringResultEngFigureResult。
当以EngEvalString作为项目时
VB向MATLAB传送一条可执行的命令MATLAB执行该命令其生成的字符串结果可以用EngStringResult以文本方式取回MATLAB生成的图形结果将以元文件metafile的格式放在剪贴板中可以用EngFigureResult以文本方式和图元文件方式取回。
以矩阵名称作为项目时
VB可以从MATLAB取回数据为矩阵赋值还可以向MATLAB中的矩阵传送数据。
下面以一个例子说明
VB和MATLAB进行动态数据交换的过程。
例:利用动态数据交换功能在
VB程序的一个文本框中输入一条绘图命令并将结果分别显示在另一个文本框和图像框中。
在
VB集成开发环境中建立一个含有两个名为TextInput、TextOutput文本框控件和一个名为Image1的图像控件的标准EXE工程。
建议把Image1的Stretch属性设为False则图像控件自动调整为被加载图像的大小。
详细程序如下:SubTextInput—KeyPressKeyAsciiAsIntegerIfKeyAsciivbKeyReturnThenRem如果在TextInput文本框中按下回车键那么初始化TextInput文本框与MATLAB之间的会话Rem会话的主题为Engine会话的项目为EngEvalString.TextInput.LinkModevbLinkNoneTextInput.LinkTopic〃MATLABEngine〃TextInput.LinkItem〃EngEvalString〃TextInput.LinkModevbLinkManualRem取出文本框TextInput中的字符串这个文本方式的字符串就是送到MATLAB中执行的命令szCommandTextInput.TextRem在MATLAB中执行此命令TextInput.LinkExecuteszCommandTextInput.LinkModevbLinkNoneRem初始化TextOutput文本框与MATLAB之间的会话Rem会话的主题为Engine会话的项目为EngStringResultTextOutput.LinkModevbLinkNoneTextOutput.LinkTopic〃MATLABEngine〃TextOutput.LinkItem〃EngFigureResult〃TextOutput.LinkModevbLinkManualRem将TextInput中命令执行的结果以文本方式取回放在第21卷2001年2月
计算机应用ComputerApplicationsVol.21No.2Feb.2001TextOutput中TextOutput.LinkRequestTextOutput.LinkModevbLinkNoneRem将TextInput中命令执行的图形结果从剪贴板中取回放在Image1中显示Image1.PictureClipboard.GetDataEndIfEndSub运行结果:在TextInput中输入一个绘图命令“surfpeaks”按下回车键后
VB应用程序通过建立与MATLAB的DDE会话经MATLAB执行后在TextOutput中显示yes在Image1中显示所生成的图形。
2 MATLAB的ActiveX自动化服务功能ActiveX自动化OLE自动化协议是一种允许一个应用程序控制端去控制另一个应用程序服务器端的协议。
由于
VB支持ActiveX自动化控制端协议MATLAB支持ActiveX自动化服务器端协议因此如果已经建立了一个
VB应用程序和MATLAB之间的ActiveX自动化连接那么在一个
VB应用程序中就可以调用MATLAB的命令、向MATLAB传送或从MATLAB接收矩阵数组。
在Windows
注册表中MATLAB的ActiveX对象名为“Matlab.Application”。
在
VB应用程序中创建ActiveX对象的具体步骤如下:DimMatlabasObjectDimResultasStringSetMatlabCreateObject〃Matlab.Application〃在
VB应用
程序中创建了MATLAB的ActiveX对象以后就可以使用这个对象所包含的各种方法来实现对MATLAB的调用。
Matlab.Application对象含有3个方法它们是ExecuteGetFullMatrixPutFullMatrix利用这些方法在
VB应用程序内可实现任何MATLAB功能。
现简单介绍它们的用法:BSTRExecuteinBSTRCommand执行Execute方法将调用MATLAB执行一条由Command字符串决定的MATLAB命令同时返回一个输出字符串表示命令的执行情况绘图命令生成的图形窗口将显示在屏幕上为了在
VB中获得MATLAB中产生的图像可以使用以下两条命令先将MATLAB生成的图像以bitmap文件格式存入剪贴板中然后再将图像从剪贴板中读出。
ResultMatLab.Execute〃print-dbitmap〃Image1.PictureClipboard.GetDatavoidGetFullMatrixinBSTRNameinBSTRWorkspaceinoutSAFEARRAYdouble3prinoutSAFEARRAYdouble3piGetFullMatrix方法用来将MATLAB中的一个矩阵变量传送到
VB程序中一个1维或2维数组中。
其中Name指定了MATLAB中的矩阵变量名Workspace指定了该矩阵所在的MATLAB工作区pr是指
VB程序中的实部数组pi是指
VB程序中的虚部数组。
voidPutFullMatrixinBSTRNameinBSTRWorkspaceinSAFEARRAYdoubleprinSAFEARRAYdoublepiPutFullMatrix方法用来将
VB程序中一个1维或2维数组传送到MATLAB中的一个矩阵变量中。
MATLAB5.3以前的版本中MATLAB是作为一个多用户的ActiveX自动化服务器这就意味着几个控制端客户将连接到同一个MATLABActiveX自动化服务程序上。
如果有两个使用MATLAB作为自动化服务器的
VB程序那么当一个程序启动并试图建立与MATLAB的连接时Windows将查找是否已经有一个MATLAB自动化服务程序在运行如果有它将连接已经运行的MATLAB自动化服务器如果没有它将自动用带/Automation的命令行参数来启动MATLAB因此两个应用程序共享MATLAB的所有资源包括
工作空间中的各个变量。
而在MATLAB5.3版本中有两种方式来启动MATLAB自动化服务器这两种方式分别由使用不同的MATLABActiveX对象名区分当使用默认的对象名“Matlab.Application”时所有要求MATLAB的客户端都将连接到同一个MATLABActiveX自动化服务程序上当使用对象名“Matlab.Application.Single”时每一个客户端都与独立的MATLABActiveX自动化服务程序相连接。
因此同时运行的每个MATLAB自动化服务程序都有各自独立的工作空间和变量。
因此当有多个
VB应用程序都使用MATLAB作为ActiveX自动化服务器时需特别注意它们是否共享工作空间和变量。
3 结束语利用动态数据交换调用MATLAB时MATLAB的命令窗口必须在建立DDE会话之前已经运行在利用MATLAB作为ActiveX自动化服务器时
VB应用程序将自动启动MATLAB的ActiveX自动化服务程序并且在程序执行完后关闭ActiveX自动化服务程序。
这样在基于客户/服务器计算模式下利用动态数据交换和ActiveX自动化协议在
VB应用程序中就可以集成MATLAB强大的数值分析和图形显示能力。
参考文献1 张树兵戴红陈哲.VisualBasic6.0中文版从入门到提高M.北京:清华大学出版社1999.297-313.2 MATLABApplicationProgramInterfaceGuideA.TheMathWorksInc.C1999.3 王颖胡宗军邹介荣等.ActiveX:从VisualBasic6.0调用MATLAB的实现方法J.机
电工程19995:172-174.69 计算机应用2001年