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)
我不是在申请工作,而是能够找到问题的答案.我也发现了答案,从穆赫辛到这个问题直观(找到一个矩阵的大小而不调用内置函数).但是,我忍不住在脑海中听到阿尔伯特爱因斯坦的声音.
我认为文档有点乱,所以如果有人能够解释它是如何工作的,我会很高兴.
嵌套函数的这种使用与备注有关(有关更多信息,请参见:使用嵌套函数来记住昂贵的函数),因为它利用了在创建时存储参数值的参数函数句柄。
您需要注意两件事:
counter()
直接将函数句柄返回到嵌套函数
f1 = counter()
f1 =
@counter/increment
Run Code Online (Sandbox Code Playgroud)嵌套函数将“保存”作用域变量。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
。
让我尝试....
每次调用函数时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]
现在更有意义了吗?
创建此代码是为了利用函数句柄的此属性(它是同一件事,但复制了两次)。