在函数之间传递多个参数

Passing multiple parameters between 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 ) 与仅在 X 上执行 f 联系起来。

这是相当旧的代码(2001 年)。

现在有没有更好的方法来处理这种情况?

有没有什么方法可以做到这一点,以便 f 的实现在调用点?即 minimize.m 不可见?现有模式要求它位于单独的 f.m 文件中。

要在 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);

一般来说,it is not recommended to use eval.

如果输入参数的数量未知且可变,您可以包含 varargin as an input argument and pass the 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{:});
: