在函数

时间:2016-10-15 18:22:09

标签: matlab parameter-passing variadic-functions

我正在研究以下设计模式:

x_min = minimize( 'f', x_initial, step_size, p1, p2, p3, p4, p5 );

...其中f是某种功能......

function y = f( x, p1, p2, p3 )
    :
end

... minimize将尝试查找本地最小值:

function x_min = minimize( FUNC_NAME, x_initial, step_size, p1, p2, p3, p4, p5 )
    X = x_initial;

    % compose string used to call function
    argstr = [FUNC_NAME, '(X']; 
    for i = 1:(nargin - 3)
        argstr = [argstr, ',p', int2str(i)];
    end
    argstr = [argstr, ')'];
    :
    x1 = eval( argstr ); % etc
    :

这非常难看 - 一开始它将eval( argstr )与仅f上的X联系起来。

这是相当陈旧的代码(日期为2001年)。

现在有没有一种首选的方法来处理这种情况?

有没有办法实现这一点,以便f的实现在呼叫站点?即minimize.m不可见?现有模式要求它位于单独的f.m文件中。

2 个答案:

答案 0 :(得分:2)

要在X上执行f,您可以使用Function Handles 示例:f = @sin; f(pi/2)结果ans = 1

要在呼叫站点实施f,您可以使用Anonymous Function

例:
对函数f(x)= x ^ 2执行minimize

x_initial = 1;
step_size = 0.01;
q = minimize(@(x) x.^2, x_initial, step_size);

最小化实现示例(最小化发现的简化实现):

function x_min = minimize(f, x_initial, step_size)
    X = x_initial-10:step_size:x_initial+10; %Prepare input array for f.
    Y = f(X);
    x_min = min(Y);

答案 1 :(得分:2)

通常,it is not recommended to use eval.

如果输入参数的数量是未知且可变的,则可以包含varargin作为输入参数,并传递function handle而不是函数名称。 varargin将灵活数量的输入参数作为单元格数组合在一起,并将它们传递给函数:

function out = anyfun(func_handle, varargin)
out = func_handle(varargin{:})

举个例子:

anyfun(@mod, 123, 100)

ans =

    23

对于您的示例,您应该定义如下函数:

function x_min = minimize(FUNC_handle, x_initial, step_size, varargin)
:
x1 = FUNC_handle(varargin{:});
: