我想做的是:
a = 5
foo = @(x) x+a
a = 3
foo(1) % recieve 4
相反,我只得到6!在我运行的其他几个测试中,我得到a
在foo
时评估,而不是在调用foo
时评估。
出于各种原因,我无法使用
foo = @(x,a) x+a
答案 0 :(得分:1)
在Matlab中创建匿名函数时,它会存储所需的任何变量的当前值,而不是其输入的一部分。
所以,当你像这样创建foo
时:
a = 5
foo = @(x) x+a
它存储了相当于:
foo = @(x) x+5
即使您稍后更改a
的值,foo
内存储的常量的值也不会发生变化。
另一方面,如果您想要更改a
的值,则必须接受a
作为该函数的参数。
来源:http://www.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html
答案 1 :(得分:1)
您可以使用functions
命令检查存储数据的值:
>> a = 5
foo = @(x) x+a
a =
5
foo =
@(x)x+a
>> handleInfo = functions(foo)
handleInfo =
function: '@(x)x+a'
type: 'anonymous'
file: ''
workspace: {[1x1 struct]}
>> handleInfo.workspace{1}
ans =
a: 5
答案 2 :(得分:1)
不推荐您要求做的事情。调试起来很困难。
也就是说,可以使用evalin
函数来完成,并获取a
的当前值。
a=5;
foo = @(x)evalin('caller','a')+x;
foo(1) %Returns 6
a=3;
foo(1) %Returns 5
更好(更好!)将a
的定义推送到apprpriate数据结构或对象,并创建一个函数getCurrentValueOfA()
。然后,您可以将foo
定义为
foo = @(x) getCurrentValueOfA() + x;