如何在匿名函数中使用变量?

时间:2014-03-06 05:12:58

标签: matlab

我试图定义:

f = @(x) d*x

其中d是先前定义的变量,比如d = 2.我的目标是让它返回:

@(x) 2*x

然而,MATLAB返回:

@(x) d*x

我这样做的原因是在for循环中定义一系列函数句柄,例如

q = cell(n, 1);
for i = 1:n
    q{i} = @(y) sum(y(1:i));
end

是否可以定义使用匿名函数定义中的索引的函数句柄数组?

2 个答案:

答案 0 :(得分:5)

正确。定义f = @(x) d*x时,matlab将在本地范围内查找d。由于在功能定义时d2,因此您的函数f将有效2*x。即使您稍后更改了d的值,例如d=10,'f'功能仍将使用2

以下是一个例子:

d = 2;

f = @(x) d*x;    

f(2) % gives 4;

d = 10;

f(2) % gives 4 again. matlab will 'remember' that d was 2 at the time of 
     % f function definition 

答案 1 :(得分:4)

定义anonymous function时,完全定义函数are stored所需的变量:

  

通过使用匿名函数,您还可以从函数工作区捕获某些变量及其值,并将它们存储在句柄中。这些数据值在构造时存储在句柄中,并且只要它存在就包含在句柄中。无论何时通过其句柄调用该函数,MATLAB都会为函数提供函数调用的参数列表中指定的所有变量输入

您可以使用您创建的句柄上的functions命令对此进行验证:

>> n=3;
>> for i = 1:n, q{i} = @(y) sum(y(1:i)); end
>> f1 = functions(q{1})
f1 = 
     function: '@(y)sum(y(1:i))'
         type: 'anonymous'
         file: ''
    workspace: {[1x1 struct]}

functions命令提供有关函数句柄的一般信息,以及包含运行该函数所需的所有本地范围变量的完整工作区:

>> f1.workspace{1}
ans = 
    i: 1

正如预期的那样,i在第一个句柄q{1}中为1。现在,第二个句柄:

>> f2 = functions(q{2});
>> f2.workspace{1}
ans = 
    i: 2

第三个:

>> f3 = functions(q{3});
>> f3.workspace{1}
ans = 
    i: 3

每个句柄都存储i 的值,就像创建句柄时一样