使用Feval函数在服务器中处理MATLAB函数,该函数的调用格式为:[大谦MATLAB,dqmatlab点com]
如果MATLAB用作客户程序:
result=h.Feval('functionname', numout, arg1, arg2, ...)
result=Feval(h, 'functionname', numout, arg1, arg2, ...)
result=invoke(h,'Feval', 'functionname', numout, arg1, arg2, ...)
如果VBA用作客户程序:
void Feval([in] BSTR functionname, [in] long numout,
[out] VARIANT* result, [in] VARIANT arg1, arg2, ...)
Feval函数在句柄h表示的自动化服务器中执行字符串functionname指定的MATLAB函数。1×1的double型数组numout为函数返回的输出参数个数。服务器将函数的输出返回到元胞数组result中。
最多可以指定32个输入参数,这些参数放在numout参数的后面。传递参数有4种方式,如表2-3所示。
表2-3 参数传递机制
| 传递机制 | 描 述 |
|---|---|
| 传递值本身 | 传递任何数值或字符串值,在Feval参数列表中指定值: a=h.Feval('sin', 1, -pi:0.01:pi); |
| 传递客户变量 | 传递一个参数,该参数已经在客户程序中赋给变量,单独指定变量名: x=-pi:0.01:pi; a=h.Feval('sin', 1, x); |
| 引用服务器变量 | 引用服务器中定义的变量,指定后面带等号的变量名:
h.PutWorkspaceData('x', 'base', -pi:0.01:pi);
a=h.Feval('sin', 1, 'x='); |
| 引用并覆盖服务器变量 | 引用服务器中定义的变量并在服务器中覆盖该变量,指定变量名、等号和要赋给变量的新值:
h.PutWorkspaceData('x', 'base', -pi:0.01:pi);
a=h.Feval('sin', 1, 'x=-5:0.01:5'); |
下面举例说明Feval函数的使用。
MATLAB用作客户程序时的参数传递
1.在Feval函数中通过传递strcat函数名来聚合两个单词。
>> a=h.Feval('strcat', 1, 'hello ', 'world')
a =
'hello world'
2.进行相同的聚合,传递一个字符串和一个局部变量clistr,clistr包含第2个字符串。
>> clistr='world';
>> a=h.Feval('strcat', 1, 'hello ', clistr)
a =
'hello world'
3.本例中srvstr变量在服务器程序,而不是客户程序中定义。在变量名后面加一个等号,告诉MATLAB这是一个服务器变量,MATLAB就不会将它作为局部变量处理。
>> % 在服务器中定义变量srvstr
>> h.PutCharArray('srvstr', 'base', 'world');
>> % 用'name='语法格式传递服务器变量的名称
>> a=h.Feval('strcat', 1, 'hello ', 'srvstr=')
a =
'hello world'
4.本例与上例类似,但要给服务器变量赋新值,然后用该新值进行聚合。
>> % 在服务器上定义变量srvstr
>> h.PutCharArray('srvstr', 'base', 'world');
>> % 给srvstr赋一个新字符串并进行聚合
>> a=h.Feval('strcat', 1, 'hello ', 'srvstr=everyone')
a =
'hello everyone'
>> % 修改srvstr变量,它现在有新值
>> s=h.GetCharArray('srvstr', 'base')
s =
'everyone'
VBA用作客户程序时
下面将VBA作为客户程序,实现与上面例子相同的功能。这些例子返回与上面的相同的字符串。
1.传递两个字符串:
Dim Matlab As Object
Set Matlab=text-blue-400">CreateObject("matlab.text-blue-400">application")
Call Matlab.Feval("strcat", 1, out, "hello ", "world")
2.局部定义clistr并传递该变量:
Dim Matlab As Object
Dim clistr As text-blue-400">String
Set Matlab=text-blue-400">CreateObject("matlab.text-blue-400">application")
clistr="world"
Call Matlab.Feval("strcat", 1, out, "hello ", "clistr")
3.传递在服务器上定义的变量的名称。
Dim Matlab As Object
Set Matlab=text-blue-400">CreateObject("matlab.text-blue-400">application")
Call Matlab.PutCharArray("srvstr", "base", "world")
Call Matlab.Feval("strcat", 1, out, "hello ", "srvstr=")
4.传递在服务器上定义的变量的名称,还给该变量提供一个新值。
Dim Matlab As Object
Set Matlab=text-blue-400">CreateObject("matlab.text-blue-400">application")
Call Matlab.PutCharArray("srvstr", "base", "world")
Call Matlab.Feval("strcat", 1, out, "hello ", "srvstr=","everyone")
Call Matlab.GetCharArray("srvstr", "base", s)
客户程序为MATLAB或VB时,Feval函数的返回值有如下定义:
MATLAB用作客户程序时:
Feval函数将处理函数的返回数据放在一个元胞数组中。每个返回值在元胞数组中占一行。可以用Feval函数的第2个输入参数控制返回值的个数,如本例所示。本例要求Feval函数从fileparts函数返回3个输出参数。需要注意的是,要求返回的参数个数不能比函数返回值的最大个数多。
>> a=h.Feval('fileparts', 3, 'd:\work\ConsoleApp.cpp')
a =
'd:\work'
'ConsoleApp'
'.cpp'
VBA用作客户程序时:
下面是相同的例子,但用VBA编码。
Dim Matlab As Object
Set Matlab=text-blue-400">CreateObject("matlab.text-blue-400">application")
Call Matlab.Feval("fileparts", 4, out, "d:\work\ConsoleApp.cpp")