在自定义函数 MATLAB 中调用匿名函数

Call an anonymous function within a custom function MATLAB

我想在自定义 MATLAB 函数中调用匿名函数。从调用自定义函数的脚本中,我想最小化自定义 MATLAB 函数。我遇到匿名函数未正确传递给函数的问题。

作为MWE,我有一个脚本,我在其中定义了一个匿名函数,afunction

% directory for minimization algorithm
addpath '/somedirectory/FMINSEARCHBND'

% anonymous function
afunction = @(x) x.^2 + 2.*x - 71;

% 1D minimization guesses
xguess = 20;
xmin = -1000;
xmax = 1000;

% 1D minimization call
minx = fminsearchbnd(@(x) MWEtestfuntominimize(x), xguess, xmin, xmax);

然后我在另一个文件中编写了一个自定义函数 MWEtestfuntominimize,

function g = MWEtestfuntominimize(x)
    g = abs(afunction(x));
end

我希望我的主脚本最小化 MWEtestfuntominimize,但似乎 MWEtestfuntominimize 无法调用 afunction。错误信息是

Undefined function or variable 'afunction'

我曾尝试将 afunction 作为参数传递给 MWEtestfuntominimize,但没有成功。这是通过将最小化调用中的 minx 修改为

minx = fminsearchbnd(@(afunction,x) MWEtestfuntominimize(afunction,x), xguess, xmin, xmax);

并将自定义函数修改为

function g = MWEtestfuntominimize(afunction,x)
    g = abs(afunction(x));
end

产生的错误是

"afunction" was previously used as a variable, conflicting with its use here as the name of a function or command.

我知道一个解决方案是在 MWEtestfuntominimize 本身中定义匿名函数,但对于我正在编写的特定程序,我不想这样做。

你说通过 afunction "was unsuccessful" 但没有说明原因...这正是我解决这个问题的方法

% anonymous function
afunction = @(x) x.^2 + 2.*x - 71;
% 1D minimization call
minx = fminsearchbnd(@(x) MWEtestfuntominimize(x, afunction), xguess, xmin, xmax);

然后在你的最小化函数中...

function g = MWEtestfuntominimize(x, fcn)
    g = abs( fcn(x) );
end

为了进一步说明其工作原理,fminsearchbnd 需要一个具有单一输入的函数。这是一个只有一个输入的函数 (x)

@(x) MWEtestfuntominimize( x, afunction )

函数句柄(或其他变量)afunction 存储在匿名函数中,此时在工作区中具有相同的值。请注意,如果 afunction 之后更改,它将 而不是 在您的匿名函数中更改。

一个简单的例子是

a = 2;
f = @(x) x + a;

f(5); % = 7

a = 4; % change 'a' after the definition of 'f'
f(5); % = 7, does not change as f = @(x) x + 2 still