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

时间:2014-02-10 16:02:12

标签: 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

现在,回到基础工作区,当我将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?

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

1 个答案:

答案 0 :(得分:2)

您对匿名功能的理解是完全正确的。问题是,为什么ac未更新,qr未显示。 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