vb调用matlab工具箱,Matlab与VB集成 - 关于VB的经验之谈 - VB爱好者乐园(VBGood) - 关于VB的经验,电子教程,代码,控件,论坛,博客,微博等....

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

一、借助 ActiveX部件

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

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

● BSTR Execute([in] BSTR Command);

BSTR表示宽字符串类型,它与VB存储字符串所采用的数据格式相同。该方法接收字符串命令并在Matlab中执行,将结果以字符串形式返回。

● void GetFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in, out] SAFEARRAY(double)* pr,[in, out] SAFEARRAY(double)* pi);

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

● void PutFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in] SAFEARRAY(double) pr,[in] SAFEARRAY(double) pi);

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

示例代码如下:

Dim Matlab As Object ’声明对象

Dim MReal1(5,5) As Double

’声明存放实部的Double型数组

Dim MImag() As Double

’声明存放虚部的Double型数组

Set Matlab=CreateObject(“Matlab.Application”) ’初始化对象

Matlab.Execute(“a=hilb(5)”)

’执行Matlab命令

Call Matlab.GetFullMatrix(“a”,“base”,MReal1,MImag)

’将结果分别存入实部、虚部数组

二、借助DDE技术

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

图1 借助DDE时应用程序通信机制

图1 借助DDE时应用程序通信机制

其中,DDE功能函数既可以由应用程序提供,也可以由Matlab引擎库提供。

初始化会话时,客户端应用程序必须指定两个参数service name(服务器应用程序的名称)和topic(会话主题)。

下面的示例说明了VB与Matlab建立并完成DDE会话的全过程:

说明: TextInput是输入文本框,TextOutput是输出文本框。在TextInput中输入Matlab命令回车后,由Matlab在后台执行并将结果返回给TextOutput显示。

Sub TextInput_KeyPress(KeyAscii As Integer)

If KeyAscii = vbKeyReturn then

’初始化TextInput与Matlab间的DDE会话

TextInput.LinkMode = vbLinkNone

TextInput.LinkTopic = “MATLAB|Engine”

TextInput.LinkItem =“EngEvalString”

TextInput.LinkMode = vbLinkManual

szCommand = TextInput.Text

’执行Matlab命令

TextInput.LinkExecute szCommand

TextInput.LinkMode = vbLinkNone

’初始化TextOutput与Matlab间的DDE会话

TextOutput.LinkMode = vbLinkNone

TextOutput.LinkTopic = “MATLAB|Engine”

TextOutput.LinkItem =“EngStringResult”

TextOutput.LinkMode = vbLinkManual

’返回执行结果并显示

TextOutput.LinkRequest

TextOutput.LinkMode = vbLinkNone

End If

End Sub

三、通过M文件

Matlab产生的M文件不能直接在VB中调用,可利用mcc将M文件直接编译成.EXE文件,然后在VB中声明下面三个API函数,最后使用Shell命令即可实现VB与Matlab的无缝集成。

1. 用mcc生成独立的外部应用程序。可使用如下两种命令:

mcc -p file.m 或 mcc -m file.m

2. 在VB中声明调用的三个API函数:

● Declare Function WaitForSingleObject Lib “kernel32”(ByVal hHandle As Long, ByVal dwMilliseconds 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完成特定的计算或图形功能后,再继续其执行过程,从而实现与Matlab的集成。

四、引入MatrixVB

MatrixVB是MathWorks针对VB提供的一个Matlab库,它提供了600多个函数,包括基本的数学运算和功能强大的信号处理、线性代数、串运算及图形图像处理功能等,为VB提供了强大的功能扩展。在VB中使用该数学工具包可避免重复性劳动,从而减少开发人员实现算法和界面设计的困难。

MatrixVB是一个独立的产品(可以从www.mathworks.com得到),其使用十分方便。MatrixVB安装完成后,只需在VB工程中引用Mmatrix即可。

示例代码如下:

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

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 Matrix ’声明向量

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 Matrix

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所示:

总 结

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值