【问题标题】:Anonymous Functions calling themselves in MATLAB在 MATLAB 中调用自己的匿名函数
【发布时间】:2012-06-28 03:26:58
【问题描述】:

作为一个实验(并且因为我从用户数据生成匿名函数),我运行了以下 MATLAB 代码:

h = @(x) x * x
    h = @(x) x * x
h(3)
    ans = 9
h = @(x) h(x) + 1
    h = @(x)h(x)+1
h(3)
    ans = 10

基本上,我自己做了一个匿名函数调用。 MATLAB 没有递归地执行操作,而是记住了旧的函数定义。但是,工作区并未将其显示为变量之一,并且句柄似乎也不知道它。

只要我保留新功能,旧功能是否会被存储在幕后?这种结构有什么“陷阱”吗?

【问题讨论】:

  • 我会说设计本身就是一个“陷阱”和一个坏主意,因为它非常不直观,并且对其他查看代码的人隐藏了很多东西。

标签: matlab anonymous-function


【解决方案1】:

匿名函数在定义时会记住工作区的相关部分,并对其进行复制。因此,如果您在匿名函数的定义中包含一个变量,并且稍后更改该变量,它将保留匿名函数中的旧值。

>> a=1;
>> h=@(x)x+a %# define an anonymous function
h = 
    @(x)x+a
>> h(1)
ans =
     2
>> a=2 %# change the variable
a =
     2
>> h(1)
ans =
     2 %# the anonymous function does not change
>> g = @()length(whos)
g = 
    @()length(whos)
>> g()
ans =
     0 %# the workspace copy of the anonymous function is empty
>> g = @()length(whos)+a
g = 
    @()length(whos)+a
>> g()
ans =
     3 %# now, there is something in the workspace (a is 2)
>> g = @()length(whos)+a*0
g = 
    @()length(whos)+a*0
>> g()
ans =
     1 %# matlab doesn't care whether it is necessary to remember the variable
>> 

【讨论】:

  • 那么这是否意味着我不想对大型矩阵使用匿名函数,尤其是在考虑内存的情况下?带有常量的匿名函数是否像带有参数的函数一样工作,只有在事情发生变化时才会复制?
  • @AndrewPiliser:我认为写时复制也适用于匿名函数,即只要您不更改 a 的值,就可以了。 edit:刚刚测试过。是的,它是写时复制。
  • +1 仅供参考,我认为匿名函数不仅会捕获工作区“相关部分”的副本,还会捕获到创建句柄时的整个工作区的副本。至少在早期的 Matlab 版本中。 (eval 的存在意味着 Matlab 在解析时不一定知道什么是相关的。)嵌套函数以这种方式工作,它们关闭了实时变量。您可以在函数句柄上使用 info = functions(h) 来查看它捕获的内容,或在调试器中检查它。
猜你喜欢
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2016-05-08
  • 1970-01-01
  • 2014-09-11
相关资源
最近更新 更多