如何将参数传递给函数句柄,但仅在调用时解释它?

时间:2014-04-10 19:00:30

标签: matlab anonymous-function function-handle

我想做的是:

a = 5 
foo = @(x) x+a
a = 3
foo(1) % recieve 4
相反,我只得到6!在我运行的其他几个测试中,我得到afoo时评估,而不是在调用foo时评估。

出于各种原因,我无法使用

foo = @(x,a) x+a

3 个答案:

答案 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;