如何在MATLAB中将带有固定参数的函数作为参数传递?

3
我想将带有参数的函数传递给另一个以函数处理程序(指针)作为参数的函数,但其中一些函数处理程序的参数需要固定。在MATLAB中如何实现这一点?
具体来说,我想使用fminsearch(fun,x0)最小化函数h(eta)。一个明显的问题是,如果我将所有参数都传递给x0,它将最小化所有参数,但这不是我想要做的。我真正想做的是:

enter image description here

我尝试了以下方法,就我测试的范围而言似乎有效:
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]

看起来它没有受到影响(即它按照我想要的方式工作)。但为了安全起见,我希望这不是某种奇怪的边缘情况,导致它无法正常工作。

1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接