我最近了解到匿名函数可以携带大量未使用的数据,即使这些数据是在实例化匿名函数之后创建的。以下示例与FUNCTIONS命令一起说明了这一点,
function fun=test %place in an mfile
a=1;
b=2;
c=3;
fun=@(x)x+b+a;
a=7;
b=rand(1000);
c=5;
q=3;
r=4;
end
现在,回到基础工作区,当我将functions()命令应用于'fun'时,我看到了
>> fun=test; s=functions(fun); s.workspace{:}
ans =
b: 2
a: 1
ans =
fun: @(x)x+b+a
a: 1
b: [1000x1000 double]
c: 3
我想了解(如果可能的话,还有官方文档)匿名函数用来决定携带哪些数据的规则。以上似乎表明s.workspace{1}
将始终包含匿名函数实际使用的外部变量及其值。同时s.workspace{2}
似乎包含在定义 fun
之前进入范围的变量的更新。我是否正确这些是规则?但是,如果是这样,那么为什么s.workspace{2}
包含对b的更新,而不是a和c?
这些事情看起来很重要,因为很明显,我最终会携带大量无意识的内存,这些内存是在创建匿名函数后分配的。
答案 0 :(得分:2)
您对匿名功能的理解是完全正确的。问题是,为什么a
和c
未更新,q
和r
未显示。 Matlab做了一些代码分析并删除了所有不相关的行。既不读取变量也不调用函数。将行为与此代码进行比较:
function fun=test %place in an mfile
a=1;
b=2;
c=3;
fun=@(x)x+b+a;
a=7;
b=rand(1000);
c=5;
q=3;
r=4;
eval('');
end
由于eval('')
代码分析无法识别任何不相关的行。输出是:
ans =
b: 2
a: 1
ans =
fun: @(x)x+b+a
a: 7
b: [1000x1000 double]
c: 5
q: 3
r: 4