我正在研究以下设计模式:
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
文件中。
答案 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{:});
: