从 Visual Basic .NET 客户端调用 MATLAB 函数
通过这两语句建立起与Matlab的链接
Dim MatLab As Object
MatLab = CreateObject("Matlab.Application")
下面这个示例通过 COM 接口从 Microsoft® Visual Basic® 客户端应用程序调用用户定义的 MATLAB® 函数 solve_bvp
。它还在新 MATLAB 窗口中绘制图形并执行简单的计算:
Dim MatLab As Object
Dim Result As String
Dim MReal(1, 3) As Double
Dim MImag(1, 3) As Double
MatLab = CreateObject("Matlab.Application")
'Calling MATLAB function from VB
'Assuming solve_bvp exists at specified location
Result = MatLab.Execute("cd d:\matlab\work\bvp")
Result = MatLab.Execute("solve_bvp")
'Executing other MATLAB commands
Result = MatLab.Execute("surf(peaks)")
Result = MatLab.Execute("a = [1 2 3 4; 5 6 7 8]")
Result = MatLab.Execute("b = a + a ")
'Bring matrix b into VB program
MatLab.GetFullMatrix("b", "base", MReal, MImag)
Execute
在自动化服务器中执行 MATLAB 命令
Execute(command As String) As String
在 MATLAB 服务器中创建一个 6×6 矩阵,删除行 4–6,并将结果返回到客户端。
Dim Matlab As Object
Dim server_version As String
Matlab = CreateObject("matlab.application")
MatLab.PutWorkspaceData("A","base",rand(6))
Matlab.Execute("A(4:6,:) = [];")
Matlab.GetWorkspaceData("A","base",B)
Feval
Feval(String functionname, long numout, arg1, arg2, ...) As Object
传递参数
此示例说明如何使用 Feval
传递参数,以从 Visual Basic® .NET 客户端执行 MATLAB 自动化服务器上的 MATLAB 命令。
'在服务器上将两个字符串传递给 MATLAB 函数 strcat:
Dim Matlab As Object
Dim out As Object
out = Nothing
Matlab = CreateObject("matlab.application")
Matlab.Feval("strcat",1,out,"hello"," world")
'以本地方式定义 clistr 并传递此变量:
Dim clistr As String
clistr = " world"
Matlab.Feval("strcat",1,out,"hello",clistr)
'传递服务器上定义的变量的名称:
Matlab.PutCharArray("srvstr","base"," world")
Matlab.Feval("strcat",1,out,"hello","srvstr=")
定义 Feval 返回值
Feval
返回元胞数组中的已计算函数的数据。元胞数组的每一行中有一个返回值。应使用 numout
参数控制返回值的数目。
Dim Matlab As Object
Dim out As Object
Matlab = CreateObject("matlab.application")
Matlab.Feval("fileparts",3,out,"d:\work\ConsoleApp.cpp")
创建服务器变量
要修改服务器变量 A
,可以在客户端定义变量 rows
和 cols
。
'在服务器中创建矩阵 A。
Dim Matlab As Object
Dim server_version As String
Matlab = CreateObject("matlab.application")
MatLab.PutWorkspaceData("A","base",rand(6))
'调整 A 的形状。
rows = 6
cols = 3
Matlab.Feval("reshape",0,"A=",rows,cols)
'MATLAB 将表达式 'A=' 中的 A 解释为服务器的变量名称。
'reshape 函数并不修改变量 A。
Matlab.GetWorkspaceData("A","base",B)
'A 保持不变。
'要获取 reshape 函数的结果,请使用 numout 参数将该值指定给 C。
Matlab.Feval("reshape",1,"A=",rows,cols,C)
GetFullMatrix
获取matlab工作区的矩阵
GetFullMatrix(varname As String, workspace As String, [out] XReal As Double, [out] XImag As Double)
GetFullMatrix
只适用于值类型为 double
的二维矩阵。将 GetVariable
或 GetWorkspaceData
用于其他类型。要使用更高维度的矩阵,需要在从 MATLAB® 接收二维矩阵后对其重构
GetVariable
获取matlab工作区变量
GetVariable(varname As String, workspace As String) As Object
请勿对稀疏数组、结构体或函数句柄使用 GetVariable
。
如果您的脚本语言要求显式返回结果,请使用 GetVariable
函数代替 GetWorkspaceData
、GetFullMatrix
或 GetCharArray
。
此示例使用 Visual Basic® .NET 客户端从 MATLAB® 自动化服务器读取数据:
Dim Matlab As Object
Dim Result As String
Dim C2 As Variant
Matlab = CreateObject("matlab.application")
Result = Matlab.Execute("C1 = {25.72, 'hello', rand(4)};")
C2 = Matlab.GetVariable("C1", "base")
MsgBox("Second item in cell array: " & C2(0, 1))
GetWorkspaceData
获取matlab工作区中数据
GetWorkspaceData(varname As String, workspace As String) As Object
对于 VBScript 客户端,使用 GetWorkspaceData
和 PutWorkspaceData
函数向 MATLAB® 工作区传递数值数据和从该工作区传出数值数据。这些函数使用 variant
数据类型而非 GetFullMatrix
和 PutFullMatrix
使用的 safearray
数据类型。VBScript 不支持 safearray
。
PutFullMatrix
给自动化服务器工作区中的矩阵赋值
PutFullMatrix([in] varname As String, [in] workspace As String, [in] xreal As Double, [in] ximag As Double)
矩阵不能是标量或空数组,也不能大于两维。要使用更高维度的矩阵,请先将该矩阵重构为二维矩阵,再发送给 MATLAB® 服务器。然后,在从 MATLAB 收到矩阵之后,再将维度更改回来。
对于 VBScript 客户端,使用 GetWorkspaceData
和 PutWorkspaceData
函数向 MATLAB 工作区传递数值数据和从该工作区传出数值数据。这些函数使用 variant
数据类型代替 VBScript 不支持的 safearray
。
本示例使用 Visual Basic® .NET 客户端来将矩阵写入到服务器的基础工作区
Dim MatLab As Object
Dim XReal(4, 4) As Double
Dim XImag(4, 4) As Double
Dim ZReal(4, 4) As Double
Dim ZImag(4, 4) As Double
Dim i, j As Integer
For i = 0 To 4
For j = 0 To 4
XReal(i, j) = Rnd() * 6
XImag(i, j) = 0
Next j
Next i
Matlab = CreateObject("matlab.application")
MatLab.PutFullMatrix("M","base",XReal,XImag)
MatLab.GetFullMatrix("M","base",ZReal,ZImag)
使用 Visual Basic .NET 客户端来将矩阵写入到服务器的全局工作区:
Dim MatLab As Object
Dim XReal(1,2) As Double
Dim XImag(1,2) As Double
Dim result As String
Dim i,j As Integer
For i = 0 To 1
For j = 0 To 2
XReal(i,j) = (j * 2 + 1) + i
XImag(i,j) = 1
Next j
Next i
Matlab = CreateObject("matlab.application")
MatLab.PutFullMatrix("X","global",XReal,XImag)
result = Matlab.Execute("whos global")
MsgBox(result)
PutWorkspaceData
PutWorkspaceData(varname As String, workspace As String, data As Object)
使用 PutWorkspaceData
分别将数值和字符数组数据传递到服务器。请勿对稀疏数组、结构体或函数句柄使 PutWorkspaceData
。对这些数据类型使用 Execute
方法。
GetWorkspaceData
和 PutWorkspaceData
函数将数值数据作为 variant
数据类型传递。这些函数对 VBScript 客户端特别有用,因为 VBScript 不支持 GetFullMatrix
和 PutFullMatrix
使用的 safearray
数据类型。
将数据存入变量A中
Dim Matlab As Object
Dim data(6) As Double
Dim i As Integer
MatLab = CreateObject("matlab.application")
For i = 0 To 6
data(i) = i * 15
Next i
MatLab.PutWorkspaceData("A","base",data)
MsgBox("In MATLAB, type" & vbCrLf & "A")
示例
......
https://ww2.mathworks.cn/help/matlab/call-matlab-com-automation-server.html