2

What I want to do is:

a = 5 
foo = @(x) x+a
a = 3
foo(1) % recieve 4

Instead, I only get 6! On several other tests I ran, I get that a is evaluated when foo is, and and not when foo is called.

For various reasons, I can't work with

foo = @(x,a) x+a
4

3 回答 3

1

不建议您要求执行的操作。调试起来会很困难。

也就是说,可以使用evalin函数来完成并获取 的当前值a

a=5; 
foo = @(x)evalin('caller','a')+x; 
foo(1)  %Returns 6

a=3; 
foo(1)  %Returns 5

更好(好多了!)将定义推a入适当的数据结构或对象,并创建一个函数getCurrentValueOfA()。然后你可以定义foo

foo = @(x) getCurrentValueOfA() + x;
于 2014-04-10T20:24:25.640 回答
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

于 2014-04-10T19:10:10.787 回答
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
于 2014-04-10T19:35:57.280 回答