嵌套函数如何在MATLAB中工作?

Ste*_*fin 6 matlab nested-function

所以,我正在申请一份工作,需要弄清楚嵌套函数的工作原理.更具体地说,我想知道gnovice发布的以下示例是如何工作的.

问题是:

给定以下函数,在命令窗口中输入下面的代码时输出是什么?

function fcnHandle = counter
  value = 0;
  function currentValue = increment
    value = value+1;
    currentValue = value;
  end
  fcnHandle = @increment;
end

f1 = counter();
f2 = counter();
output = [f1() f1() f2() f1() f2()];  %# WHAT IS IT?!
Run Code Online (Sandbox Code Playgroud)

我不是在申请工作,而是能够找到问题的答案.我也发现了答案,从穆赫辛这个问题直观(找到一个矩阵的大小而不调用内置函数).但是,我忍不住在脑海中听到阿尔伯特爱因斯坦的声音.

在此输入图像描述

我认为文档有点乱,所以如果有人能够解释它是如何工作的,我会很高兴.

Ole*_*leg 5

嵌套函数的这种使用与备注有关(有关更多信息,请参见:使用嵌套函数来记住昂贵的函数),因为它利用了在创建时存储参数值的参数函数句柄

您需要注意两件事:

  1. counter() 直接将函数句柄返回到嵌套函数

    f1 = counter()
    f1 = 
       @counter/increment
    
    Run Code Online (Sandbox Code Playgroud)
  2. 嵌套函数将“保存”作用域变量。functions()有关详情,请参阅。

    s = functions(f1)
    s = 
         function: 'counter/increment'
             type: 'nested'
             file: '\\ic.ac.uk\homes\ok1011\MATLAB\counter.m'
        workspace: {[1x1 struct]}
    
    Run Code Online (Sandbox Code Playgroud)

    范围内的工作空间保留:

    s.workspace{1}
    ans = 
        fcnHandle: @counter/increment
            value: 0
    
    Run Code Online (Sandbox Code Playgroud)

基本上,counter()将初始化value为零,然后@counter/increment执行的连续调用value = value+1;

最后,@counter/increment被分配给f1并且所有f1()操作都@counter/increment()在先前初始化的上进行value。初始化时f2 = counter(),创建另一个计数器,并单独保存workspace


And*_*uri 4

让我尝试....

每次调用函数时counter()都会创建一个唯一的函数句柄。该函数句柄是一个名为increment的函数的句柄,该函数获取自己的变量值,并将其递增1。

因此,如果调用两次,就像代码中的 (f1, f2) 每次将返回相同的函数(增量)但不同的句柄。您已将该函数定义了两次。现在他们每个人都独立工作。由于此特定函数(增量)依赖于保存的内部值进行计算,因此您可以观察如果像代码示例中那样调用,则输出 [1 2 1 3 2]。

更好地了解差异的一个好方法是将函数重新定义为:

function fcnHandle = counter(val)
  value = val;
  function currentValue = increment
    value = value+1;
    currentValue = value;
  end
  fcnHandle = @increment;
end
Run Code Online (Sandbox Code Playgroud)

并称其为:

>> f1 = counter(0);
>> f2 = counter(1000);
>> output = [f1() f1() f2() f1() f2()]  %# WHAT IS IT?
Run Code Online (Sandbox Code Playgroud)

现在,您将看到输出是[1 2 1001 3 1002]

现在更有意义了吗?

创建此代码是为了利用函数句柄的此属性(它是同一件事,但复制了两次)。