我试图定义:
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
是否可以定义使用匿名函数定义中的索引的函数句柄数组?
答案 0 :(得分:5)
正确。定义f = @(x) d*x
时,matlab将在本地范围内查找d
。由于在功能定义时d
为2
,因此您的函数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
的值,就像创建句柄时一样。