Matlab - 使用泛型参数列表调用函数句柄

时间:2013-04-04 09:43:12

标签: matlab function function-pointers

我正在玩数值积分方法,并希望有一个函数

myIntegrator(f,fParams)

我将在其中实现数值积分。

由于 f 可能需要任意数量的参数,我正在寻找 myIntegrator()的通用方法来接受函数句柄(@f)并调用它使用 fParams

为了更好地澄清,我想调用 myIntegrator ,一次使用以下 @g 然后使用 @h (只是一些数字)函数):

g(x,y)
h(x)

我想知道是否有一行我可以在 myIntegrator 中使用的代码:

myIntegrator(f,fParams)
   invoke(f,fParams)
end

并且可以同时用于

myIntegrator(@g,[x,y])

myIntegrator(@h,[x])

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您是否考虑过使用variable number of input arguments varargin

function myIntegrator( f, varargin )
%
%
fprintf(1, 'function f got %d arguemnts\n', nargin );
% calling f with its arguments
f( varargin{:} );

有关详细信息,请参阅varargin上的手册。

现在你可以称之为

myIntegrator( @g, x, y );

以及

myIntegrator( @h, x );

答案 1 :(得分:0)

我认为你正在寻找feval

>> feval(@cos, pi)
ans =
   -1

feval接受任意数量的输入,然后将其作为函数f的输入。另外,feval适用于由字符串定义的函数句柄和函数。

传递参数的一种好机制是varargin方法,在调用f时进行单元格扩展,如Shai所述。

但是,我建议你忘掉这一切,然后走另一条路; 匿名函数

[t,y] = myIntegrator(@(t,x) f(a,t,c,x,y), ...)
[t,y] = myIntegrator(@(t,x) g(x,y,z,u,v,t), ...)

积分器(如果你确实是指ODE的求解器;否则,它们被称为正交方法)通常只将时间t和状态变量x输入到微分方程中。这也是你用数学方式编写它的方式。

DE可能需要的任何其他参数(常量,数据,文件名,......) 集成商负责传递;这是 来电者 的责任。集成商不应该知道你的函数的任何细节,也不应该有一个或多或少复制已经内置到MATLAB中的东西的机制;它违反了KISS principle

我所谈论的这种责任转移是通过我上面给出的简单例子来实现的。请查看如何使用ode45获取更多详细信息,或this page关于此事项的MATLAB文档经常引用的内容。