我想将一个带有参数的函数传递给另一个以函数处理程序(指针)作为参数的函数,但函数处理函数的一些参数需要修复。如何在MATLAB中做到这一点?
具体而言,我想使用h(eta)
最小化函数fminsearch(fun,x0)
。一个显而易见的问题是,如果我传递x0
中的所有参数,它将最小化所有参数,但这不是我想要做的。我真正想做的是:
我尝试了以下内容,它似乎在我测试它时起作用:
function [ h ] = function_returner( x )
%
t = -10000;
h = @(eta)-10*x + t + eta^2;
end
以及测试它的脚本:
h = function_returner(0);
h(3) %-9991
[x,fval,exitflag] = fminsearch(h,[10]) %returns [0, -10000, 1]
返回正确的最小值和x的正确值,在该值处获得最小值。我想确定的是,在我返回函数处理程序之后,h
修复的变量确实保持不变。即如果传递h
,那么如何确保变量不会因为它们进入与函数处理程序中具有相同变量名称的环境而改变值?
我还写道:
x = inf;
t = inf;
eta = inf;
h = function_returner(0);
h(3) %-9991
[x,fval,exitflag] = fminsearch(h,[10]) %returns [0, -10000, 1]
它似乎没有受到影响(即它可以正常工作)。但为了安全起见,我希望没有一些奇怪的边缘条件,这不起作用。
答案 0 :(得分:3)
你不必要地担心。 :-)问题是,当你创建一个匿名函数时,用于其定义的所有外部变量都是冻结,所以你不必担心该函数会改变你的行为背后的行为通过修改参数返回。要测试这个,请尝试以下脚本:
a = 1;
b = 2;
f = @(u,v) u*a + v*b;
x = f(1,1); %// x is 3 = 1*1 + 1*2
a = 2;
b = 3;
g = @(w) f(w,a)
y = g(1); %// y is 5 = f(1,2) = 1*1 + 2*2