匿名函数存储了多少额外数据?

Mat*_*t J 8 matlab

我最近了解到匿名函数可以携带大量未使用的数据,即使这些数据是在实例化匿名函数之后创建的.以下示例与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
Run Code Online (Sandbox Code Playgroud)

现在,回到基础工作区,当我将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
Run Code Online (Sandbox Code Playgroud)

我想了解(如果可能的话,还有官方文档)匿名函数用来决定携带哪些数据的规则.以上似乎表明s.workspace{1}将始终包含匿名函数实际使用的外部变量及其值.同时,s.workspace{2}似乎包含了 fun定义之前进入范围的变量的更新.我是否正确这些是规则?但是,如果是这样,那么为什么,在上面,确实s.workspace{2}包含对b的更新,但不包含对a和c的更新?

这些事情看起来很重要,因为很明显,我最终会携带大量无意识的内存,这些内存是在创建匿名函数后分配的.

Dan*_*iel 2

您对匿名函数的理解是完全正确的。问题是,为什么ac没有更新并且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
Run Code Online (Sandbox Code Playgroud)

由于eval('')代码分析无法识别任何不相关的行。输出是:

ans = 

    b: 2
    a: 1


ans = 

    fun: @(x)x+b+a
      a: 7
      b: [1000x1000 double]
      c: 5
      q: 3
      r: 4
Run Code Online (Sandbox Code Playgroud)