传递和处理MATLAB函数

使用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函数名来聚合两个单词。

code.matlab
>> a=h.Feval('strcat', 1, 'hello ', 'world')
a =
    'hello world'

2.进行相同的聚合,传递一个字符串和一个局部变量clistr,clistr包含第2个字符串。

code.matlab
>> clistr='world';
>> a=h.Feval('strcat', 1, 'hello ', clistr)
a =
    'hello world'

3.本例中srvstr变量在服务器程序,而不是客户程序中定义。在变量名后面加一个等号,告诉MATLAB这是一个服务器变量,MATLAB就不会将它作为局部变量处理。

code.matlab
>;> % 在服务器中定义变量srvstr
>> h.PutCharArray('srvstr', 'base', 'world');
>;> % 用'name='语法格式传递服务器变量的名称
>> a=h.Feval('strcat', 1, 'hello ', 'srvstr=')
a =
    'hello world'

4.本例与上例类似,但要给服务器变量赋新值,然后用该新值进行聚合。

code.matlab
>;> % 在服务器上定义变量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.传递两个字符串:

code.excel vba
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并传递该变量:

code.excel vba
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.传递在服务器上定义的变量的名称。

code.excel vba
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.传递在服务器上定义的变量的名称,还给该变量提供一个新值。

code.excel vba
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个输出参数。需要注意的是,要求返回的参数个数不能比函数返回值的最大个数多。

code.matlab
>> a=h.Feval('fileparts', 3, 'd:\work\ConsoleApp.cpp')
a =
    'd:\work'
    'ConsoleApp'
    '.cpp'

VBA用作客户程序时:

下面是相同的例子,但用VBA编码。

code.excel 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")