vb调用matlab的四种方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、借助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方法类似。
示例代码如下:
1Dim Matlab As Object ’声明对象
2Dim MReal1(5,5) As Double ’声明存放实部的Double型数组
3Dim MImag() As Double ’声明存放虚部的Double型数组
4Set Matlab=CreateObject(“Matlab.Application”) '初始化对象
5Matlab.Execute(“a=hilb(5)”) '执行Matlab命令
6Call Matlab.GetFullMatrix(“a”,“base”,MReal1,MImag) '将结果分别存入实部、虚部数组
复制代码
二、借助DDE技术
DDE(Dynamic Data Exchange)允许Microsoft Windows应用程序通过交换数据实现彼此间的通信。应用程序间彼此通信要先建立一个DDE会话,对会话进行初始化的应用程序称为客户端(Client),对Client端作出响应的应用程序称为服务器(Server)。图1描述了Matlab 作为服务器时与其他应用程序的通信机制。
其中,DDE功能函数既可以由应用程序提供,也可以由Matlab引擎库提供。
初始化会话时,客户端应用程序必须指定两个参数service name(服务器应用程序的名称)和topic(会话主题)。
下面的示例说明了VB与Matlab建立并完成DDE会话的全过程:
7
8说明: T extInput是输入文本框,T extOutput是输出文本框。在T extInput中输入Matlab命令回车后,由Matlab在后台执行并将结果返回给TextOutput显示。
9Sub T extInput_KeyPress(KeyAscii As Integer)
10If KeyAscii = vbKeyReturn then’初始化TextInput与Matlab间的DDE会话
11TextInput.LinkMode = vbLinkNone
12TextInput.LinkTopic = “MATLAB|Engine”
13TextInput.LinkItem =“EngEvalString”
14TextInput.LinkMode = vbLinkManual
15szCommand = TextInput.Text’执行Matlab命令
16TextInput.LinkExecute szCommand
17TextInput.LinkMode = vbLinkNone’初始化T extOutput与Matlab间的DDE会话
18TextOutput.LinkMode = vbLinkNone
19TextOutput.LinkTopic = “MATLAB|Engine”
20TextOutput.LinkItem =“EngStringResult”
21TextOutput.LinkMode = vbLinkManual’返回执行结果并显示
22TextOutput.LinkRequest
23TextOutput.LinkMode = vbLinkNone
24End If
25End 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. 示例代码
26
27Dim lT ask As Long, lret As Long, lHandle As Long’执行file.exe文件
28lT ask = Shell(“file.exe”, vbNormalFocus)
29lHandle = OpenProcess(SYNCHRONIZE, False, lT ask)’等待进程执行完毕
30lret = WaitForSingleObject(lHandle, INFINITE)
31lret = CloseHandle(lHandle)’ file.exe文件执行完毕后,继续执行应用程序
32……
复制代码
通过以上编码,应用程序可以在执行过程中调用.EXE完成特定的计算或图形功能后,再继续其执行过程,从而实现与Matlab的集成。
四、引入MatrixVB
MatrixVB是MathWorks针对VB提供的一个Matlab库,它提供了600多个函数,包括基本的数学运算和功能强大的信号处理、线性代数、串运算及图形图像处理功能等,为VB提供了强大的功能扩展。在VB中使用该数学工具包可避免重复性劳动,从而减少开发人员实现算法和界面设计的困难。
MatrixVB是一个独立的产品(可以从得到),其使用十分方便。MatrixVB 安装完成后,只需在VB工程中引用Mmatrix即可。
工业生产中经常需要对采集到的原始信号进行分析,并对分析结果进行实时的图形化显示,下面通过在VB中引用Mmatrix来实现这一功能。示例代码如下:
33
34Dim ax as Variant ’声明坐标轴
35Private Sub Form_Resize()
36vbrefresh ax ’刷新坐标轴
37End Sub
38Private Sub Form_Load()
39ax = vbaxes(Form1.hWnd) ’将坐标轴置于窗体