vb调用matlab工具箱,Matlab与VB集成 - 关于VB的经验之谈 - VB爱好者乐园(VBGood) - 关于VB的经验,电子教程,代码,控件,论坛,博客,微博等....
工業(yè)生產(chǎn)中經(jīng)常遇到復雜的數(shù)據(jù)信息處理問題,需要大運算量的矩陣計算及對分析結(jié)果進行實時、直觀的圖形化顯示。Matlab是集數(shù)值分析、矩陣運算、信號處理和圖形顯示于一體的高性能數(shù)學軟件,將其強大的計算功能與VB在圖形用戶界面開發(fā)方面的優(yōu)勢結(jié)合起來,實現(xiàn)應(yīng)用系統(tǒng)的無縫集成,對于有效縮短開發(fā)周期、優(yōu)化系統(tǒng)性能是十分有意義的。下面將分別討論Matlab與VB集成的四種方法。
一、借助 ActiveX部件
Microsoft把所有以COM為基礎(chǔ)的技術(shù)統(tǒng)稱為ActiveX技術(shù)。自動化是大多數(shù)ActiveX技術(shù)的基礎(chǔ),它可使解釋性的宏語言(如VB)能夠在不了解應(yīng)用程序?qū)崿F(xiàn)細節(jié)的情況下控制自動化對象。Matlab實現(xiàn)了ActiveX自動化服務(wù)支持,在VB下通過ActiveX自動化接口可將Matlab作為Visual Basic語言的一個ActiveX部件調(diào)用。
Matlab ActiveX自動化服務(wù)的功能主要包括在Matlab工作空間執(zhí)行Matlab命令,以及直接從工作空間存取矩陣等,下面列出了Matlab自動化服務(wù)支持的幾個主要方法,其參數(shù)和返回值的類型采用ActiveX自動化協(xié)議所定義的與語言無關(guān)的類型描述:
● BSTR Execute([in] BSTR Command);
BSTR表示寬字符串類型,它與VB存儲字符串所采用的數(shù)據(jù)格式相同。該方法接收字符串命令并在Matlab中執(zhí)行,將結(jié)果以字符串形式返回。
● void GetFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in, out] SAFEARRAY(double)* pr,[in, out] SAFEARRAY(double)* pi);
該方法從指定的工作空間檢索一個完整的一維或二維的實型或虛mxArray,其實部和虛部被分別存放到兩個單獨的Double型數(shù)組中。
● void PutFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in] SAFEARRAY(double) pr,[in] SAFEARRAY(double) pi);
該方法將一個mxArray放入指定的工作空間。各參數(shù)的含義及調(diào)用方法與GetFullMatrix方法類似。
示例代碼如下:
Dim Matlab As Object ’聲明對象
Dim MReal1(5,5) As Double
’聲明存放實部的Double型數(shù)組
Dim MImag() As Double
’聲明存放虛部的Double型數(shù)組
Set Matlab=CreateObject(“Matlab.Application”) ’初始化對象
Matlab.Execute(“a=hilb(5)”)
’執(zhí)行Matlab命令
Call Matlab.GetFullMatrix(“a”,“base”,MReal1,MImag)
’將結(jié)果分別存入實部、虛部數(shù)組
二、借助DDE技術(shù)
DDE(Dynamic Data Exchange)允許Microsoft Windows應(yīng)用程序通過交換數(shù)據(jù)實現(xiàn)彼此間的通信。應(yīng)用程序間彼此通信要先建立一個DDE會話,對會話進行初始化的應(yīng)用程序稱為客戶端(Client),對Client端作出響應(yīng)的應(yīng)用程序稱為服務(wù)器(Server)。圖1描述了Matlab作為服務(wù)器時與其他應(yīng)用程序的通信機制。
圖1 借助DDE時應(yīng)用程序通信機制
圖1 借助DDE時應(yīng)用程序通信機制
其中,DDE功能函數(shù)既可以由應(yīng)用程序提供,也可以由Matlab引擎庫提供。
初始化會話時,客戶端應(yīng)用程序必須指定兩個參數(shù)service name(服務(wù)器應(yīng)用程序的名稱)和topic(會話主題)。
下面的示例說明了VB與Matlab建立并完成DDE會話的全過程:
說明: TextInput是輸入文本框,TextOutput是輸出文本框。在TextInput中輸入Matlab命令回車后,由Matlab在后臺執(zhí)行并將結(jié)果返回給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
’執(zhí)行Matlab命令
TextInput.LinkExecute szCommand
TextInput.LinkMode = vbLinkNone
’初始化TextOutput與Matlab間的DDE會話
TextOutput.LinkMode = vbLinkNone
TextOutput.LinkTopic = “MATLAB|Engine”
TextOutput.LinkItem =“EngStringResult”
TextOutput.LinkMode = vbLinkManual
’返回執(zhí)行結(jié)果并顯示
TextOutput.LinkRequest
TextOutput.LinkMode = vbLinkNone
End If
End Sub
三、通過M文件
Matlab產(chǎn)生的M文件不能直接在VB中調(diào)用,可利用mcc將M文件直接編譯成.EXE文件,然后在VB中聲明下面三個API函數(shù),最后使用Shell命令即可實現(xiàn)VB與Matlab的無縫集成。
1. 用mcc生成獨立的外部應(yīng)用程序。可使用如下兩種命令:
mcc -p file.m 或 mcc -m file.m
2. 在VB中聲明調(diào)用的三個API函數(shù):
● 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
’執(zhí)行file.exe文件
lTask = Shell(“file.exe”, vbNormalFocus)
lHandle = OpenProcess(SYNCHRONIZE, False, lTask)
’等待進程執(zhí)行完畢
lret = WaitForSingleObject(lHandle, INFINITE)
lret = CloseHandle(lHandle)
’ file.exe文件執(zhí)行完畢后,繼續(xù)執(zhí)行應(yīng)用程序
……
通過以上編碼,應(yīng)用程序可以在執(zhí)行過程中調(diào)用.EXE完成特定的計算或圖形功能后,再繼續(xù)其執(zhí)行過程,從而實現(xiàn)與Matlab的集成。
四、引入MatrixVB
MatrixVB是MathWorks針對VB提供的一個Matlab庫,它提供了600多個函數(shù),包括基本的數(shù)學運算和功能強大的信號處理、線性代數(shù)、串運算及圖形圖像處理功能等,為VB提供了強大的功能擴展。在VB中使用該數(shù)學工具包可避免重復性勞動,從而減少開發(fā)人員實現(xiàn)算法和界面設(shè)計的困難。
MatrixVB是一個獨立的產(chǎn)品(可以從www.mathworks.com得到),其使用十分方便。MatrixVB安裝完成后,只需在VB工程中引用Mmatrix即可。
示例代碼如下:
說明: 工業(yè)生產(chǎn)中經(jīng)常需要對采集到的原始信號進行分析,并對分析結(jié)果進行實時的圖形化顯示,下面通過在VB中引用Mmatrix來實現(xiàn)這一功能。代碼如下:
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
’從數(shù)據(jù)庫中取原始信號存入一維向量I,取其對應(yīng)的碳含量存入一維向量C
’m為向量I、C的元素個數(shù)
Call Icheck ( I , C , m )
’調(diào)用校正函數(shù)
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為二次項系數(shù)
a1= Z.r1(2) ’a1為一次項系數(shù)
a2= Z.r1(3) ’a2為0次項系數(shù)
Clear axes ’清除坐標軸
T = Sort ( II )
’對原始信號排序,以確定作圖區(qū)間
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
執(zhí)行以上代碼,結(jié)果如圖2所示:
總 結(jié)
以上幾種方法對于Matlab與VB的集成都是行之有效的,但在實際應(yīng)用中究竟采用哪一種方式應(yīng)視具體情況而定。前兩種方式比較適合Client/Server模式,后兩種方式則應(yīng)視應(yīng)用系統(tǒng)的具體要求來做選擇,相比較而言,借助M文件在執(zhí)行效率上略高一籌,而引入MatrixVB在使用上更為方便。總而言之,Matlab與VB集成可大大提高開發(fā)效率,對于解決工程問題是十分有意義的。
總結(jié)
以上是生活随笔為你收集整理的vb调用matlab工具箱,Matlab与VB集成 - 关于VB的经验之谈 - VB爱好者乐园(VBGood) - 关于VB的经验,电子教程,代码,控件,论坛,博客,微博等....的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP密码生成管理源码,php密码生成类
- 下一篇: matlab计算一个长式子,matlab