PersonalCorpus 版 (精华区)

vatlab与VB集成

武汉理工大学计算机学院 徐静 

 应用与开发 

工业生产中经常遇到复杂的数据信息处理问题,需要大运算量的矩阵计算及对分析
结果进行实时、直观的图形化显示。vatlab是集数值分析、矩阵运算、信号处理和
图形显示于一体的高性能数学软件,将其强大的计算功能与VB在图形用户界面开发
方面的优势结合起来,实现应用系统的无缝集成,对于有效缩短开发周期、优化系
统性能是十分有意义的。下面将分别讨论vatlab与VB集成的四种方法。 

一、借助ActiVeX部件 

vicrosoft把所有以COv为基础的技术统称为ActiVeX技术。
自动化是大多数ActiVeX技术的基础,它可使解释性的宏语言(如VB)能够在不了
解应用程序实现细节的情况下控制自动化对象。vatlab实现了ActiVeX自动化服务
支持,在VB下通过ActiVeX自动化接口可将vatlab作为Visual Basic语言的一个
ActiVeX部件调用。 

vatlab ActiVeX自动化服务的功能主要包括在
vatlab工作空间执行vatlab命令,以及直接从工作空间存取矩阵等,下面列出了
vatlab自动化服务支持的几个主要方法,其参数和返回值的类型采用ActiVeX自动
化协议所定义的与语言无关的类型描述: 

● BStR execute([in] BStR Command); 
  
BStR表示宽字符串类型,它与VB存储字符串所采用的数据格式
相同。该方法接收字符串命令并在vatlab中执行,将结果以字符串形式返回。 

● Void GetFullvatrix([in] BStR Name,[in] BStR Workspace,[in, 
out] SAFeARRAY(double)* pr,[in, out] SAFeARRAY(double)* pi); 

该方法从指定的工作空间检索一个完整的一维或二维的实型或虚mxArray,其实部和
虚部被分别存放到两个单独的Double型数组中。 

● Void PutFullvatrix([in] BStR Name,[in] BStR Workspace,[in] 
SAFeARRAY(double) pr,[in] SAFeARRAY(double) pi); 

该方法将一个mxArray放入指定的工作空间。各参数的含义及调用方法与GetFullvatrix
方法类似。 

示例代码如下: 
Dim vatlab As Object ’声明对象 
Dim vReal1(5,5) As Double ’声明存放实部的Double型数组 
Dim vImag() As Double ’声明存放虚部的Double型数组 
Set vatlab=CreateObject(“vatlab.Application”) ’初始化对象 
vatlab.execute(“a=hilb(5)”) ’执行vatlab命令 
Call vatlab.GetFullvatrix(“a”,“base”,vReal1,vImag) ’将结果分别
                                                          存入实部、虚部数组 
二、借助DDe技术 

DDe(Dynamic Data exchange)允许vicrosoft Windows应用程序通过交换数据实现彼此
间的通信。应用程序间彼此通信要先建立一个DDe会话,对会话进行初始化的应用程序
称为客户端(Client),对Client端作出响应的应用程序称为服务器(SerVer)。图1
描述了vatlab作为服务器时与其他应用程序的通信机制。 


图1 借助DDe时应用程序通信机制 
 
其中,DDe功能函数既可以由应用程序提供,也可以由vatlab引擎库提供。 初始化会话
时,客户端应用程序必须指定两个参数serVice name(服务器应用程序的名称)和topic
(会话主题)。 
下面的示例说明了VB与vatlab建立并完成DDe会话的全过程: 
 
说明: textInput是输入文本框,textOutput是输出文本框。在textInput中输入vatlab
命令回车后,由vatlab在后台执行并将结果返回给textOutput显示。 
 
Sub textInput_KeyPress(KeyAscii As Integer) 
If KeyAscii = VbKeyReturn then ’初始化textInput与vatlab间的DDe会话 
textInput.Linkvode = VbLinkNone 
textInput.Linktopic = “vAtLAB|engine” 
textInput.LinkItem =“engeValString” 
textInput.Linkvode = VbLinkvanual 
szCommand = textInput.text ’执行vatlab命令 
textInput.Linkexecute szCommand 
textInput.Linkvode = VbLinkNone ’初始化textOutput与vatlab间的DDe会话 
textOutput.Linkvode = VbLinkNone 
textOutput.Linktopic = “vAtLAB|engine” 
textOutput.LinkItem =“engStringResult” 
textOutput.Linkvode = VbLinkvanual ’返回执行结果并显示 
textOutput.LinkRequest 
textOutput.Linkvode = VbLinkNone 
end If 
end Sub 

三、通过v文件 
 vatlab产生的v文件不能直接在VB中调用,可利用mcc将v文件直接编译成.eXe文件,然后
在VB中声明下面三个API函数,最后使用Shell命令即可实现VB与vatlab的无缝集成。 
 1. 用mcc生成独立的外部应用程序。可使用如下两种命令: 
mcc -p file.m 或 mcc -m file.m 

2. 在VB中声明调用的三个API函数: 
 ● Declare Function WaitForSingleObject Lib “kernel32”(ByVal hHandle As Long, ByVal dwvilliseconds As Long) As Long 
 ● Declare Function CloseHandle Lib “kernel32”(ByVal hObject As Long) As Long ● Declare Function OpenProcess Lib “kernel32”(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long,ByVal dwProcessId As Long) As Long 

3. 示例代码: 
Dim ltask As Long, lret As Long, lHandle As Long ’执行file.exe文件
ltask = Shell(“file.exe”, VbNormalFocus) 
lHandle = OpenProcess(SYNCHRONIZe, False, ltask) ’等待进程执行完毕 
lret = WaitForSingleObject(lHandle, INFINIte) 
lret = CloseHandle(lHandle) ’ file.exe文件执行完毕后,继续执行应用程序
…… 
通过以上编码,应用程序可以在执行过程中调用.eXe完成特定的计算或图形功能后,再
继续其执行过程,从而实现与vatlab的集成。 

四、引入vatrixVB 
vatrixVB是vathWorks针对VB提供的一个vatlab库,它提供了600多个函数,包括基本的
数学运算和功能强大的信号处理、线性代数、串运算及图形图像处理功能等,为VB提供
了强大的功能扩展。在VB中使用该数学工具包可避免重复性劳动,从而减少开发人员实
现算法和界面设计的困难。 
 vatrixVB是一个独立的产品(可以从www.mathworks.com得到),其使用十分方便。
vatrixVB安装完成后,只需在VB工程中引用vmatrix即可。 

示例代码如下: 
 
说明: 工业生产中经常需要对采集到的原始信号进行分析,并对分析结果进行实时的图形化显示,下面通过在VB中引用vmatrix来实现这一功能。
代码如下: 

Dim ax as Variant ’声明坐标轴 
PriVate Sub Form_Resize() 
Vbrefresh ax ’刷新坐标轴 
end Sub 

PriVate Sub Form_Load() 
ax = Vbaxes(Form1.hWnd) ’将坐标轴置于窗体 
Call Form_Resize 
end Sub 

PriVate Sub Command1-Click() 
Dim I,C As vatrix ’声明向量 
Dim m As Integer ’从数据库中取原始信号存入一维向量I,取其对应的碳含
                   量存入一维向量C 
                 ’m为向量I、C的元素个数 
Call Icheck ( I , C , m ) ’调用校正函数 
end Sub 
 
PriVate Sub Icheck (I As Variant, C As Variant, ByVal m As Integer) 
Dim II,CC,Z As vatrix 
Dim a0,a1,a2 As Double 
II = zeros(m,1) 
CC = zeros(m,1) 
II(colon(1,m)) = I(colon(1,m)) 
CC(colon(1,m)) =C(colon(1,m)) ’多项式拟和求解 
Z = polyfit ( II, CC, 2 ) ’2 说明用二项式拟和 
a0= Z.r1(1) ’a0为二次项系数 
a1= Z.r1(2) ’a1为一次项系数 
a2= Z.r1(3) ’a2为0次项系数 
Clear axes ’清除坐标轴 
t = Sort ( II ) ’对原始信号排序,以确定作图区间 
J = Linspace (t(1).r1(1),t(1).r(m),20) ’横坐标向量 
CuV = plus (plus (times (a0,times (X,X) ), 
times (a1,X) ),a2) ’纵坐标向量 
tmp = plot (J,CuV) ’绘制曲线 
Hold (“on”) 
tmp = plot (II, CC,“r.”) ’绘制点 
Hold (“off”) 
end Sub 

执行以上代码,结果如图2所示: 

总 结

以上几种方法对于vatlab与VB的集成都是行之有效的,但在实际应用中
究竟采用哪一种方式应视具体情况而定。前两种方式比较适合Client/SerVer模式
,后两种方式则应视应用系统的具体要求来做选择,相比较而言,借助v文件在执
行效率上略高一筹,而引入vatrixVB在使用上更为方便。总而言之,vatlab与VB集
成可大大提高开发效率,对于解决工程问题是十分有意义的。 
 



 









;
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.649毫秒