【问题标题】:What extra data is stored by an anonymous function?匿名函数存储了哪些额外数据?
【发布时间】:2014-03-08 01:34:56
【问题描述】:

我最近了解到,匿名函数可以携带大量未使用的数据,即使这些数据是在匿名函数实例化之后创建的。以下示例与 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=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 的更新?

这些事情似乎很重要,因为很明显,我最终可能会携带大量在创建匿名函数后分配的意外内存。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    你对匿名函数的理解是完全正确的。问题是,为什么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
    

    【讨论】:

    • 谢谢,不过,我仍然不太了解“相关性”规则。在定义fun 之后发生的任何事情都不应该是相关的,不是吗?匿名函数应该引用创建匿名函数时存在的工作空间。
    • 代码优化不会删除所有不相关的行,但删除的每一行都是不相关的。最好删除所有不相关的行,但这太复杂了。 b=rand(1000) 不会被删除,因为它会更改随机数生成器的状态。 “完美”的代码优化会将fun... 之后的所有内容减少到rand(1000)
    • 我明白了。好吧,我猜只需要小心匿名函数。顺便说一句,我认为b=rand(1000) 不会因为随机数生成器而被保留。创建 fun 后,将任何非标量分配给 a、b 或 c 似乎会导致保留这些更新。
    • @A.Donda 不,它不会改变,因为相关变量是第一个b: 2 a: 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2012-12-06
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多