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集成可大大提高開發效率,對于解決工程問題是十分有意義的。
總結
以上是生活随笔為你收集整理的vb调用matlab工具箱,Matlab与VB集成 - 关于VB的经验之谈 - VB爱好者乐园(VBGood) - 关于VB的经验,电子教程,代码,控件,论坛,博客,微博等....的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP密码生成管理源码,php密码生成类
- 下一篇: java actor模型实例,详解The