在函数之间传递多个参数
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{:});
:
我正在查看以下设计模式:
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{:});
: