在自定义函数 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
我想在自定义 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