Cri*_*ngo 5 matlab lambda function handle anonymous-function
我听说这两个术语,匿名函数和函数句柄被用来指代类似f = @(x) x.^2
MATLAB 中的东西。但后来我也听说这些术语含义不同。这两个术语有何不同?
函数句柄是对函数的引用。例如,@sin
是函数 的句柄sin
。这是一个可以像函数一样进行计算的变量,但也可以将其作为参数传递给另一个函数。例如:
integral(@sin, 0, 1)\n
Run Code Online (Sandbox Code Playgroud)\n这里我们将函数sin
作为参数传递给integral
. 我们需要特殊的语法@sin
来执行此操作,因为在 MATLAB 中sin
本身与 相同sin()
,即我们调用不带参数的函数。
所以
\nf = @sin\n
Run Code Online (Sandbox Code Playgroud)\n使变量f
引用函数sin
。f
是一个函数句柄。
匿名函数是没有名称的函数。这个概念在其他一些语言中称为“lambda 表达式”或“函数文字”。@(x) x.^2
是一个匿名函数。我们不能像处理其他函数那样通过它的名称来引用它,所以我们只能通过它的句柄来引用它。所以这个表达式返回新创建的匿名函数的句柄。
因此,表达式
\nf = @(x) x.^2\n
Run Code Online (Sandbox Code Playgroud)\n两者都创建一个匿名函数,并创建f
一个引用该匿名函数的函数句柄。
注1
\n在 MATLAB 中,匿名函数也是一个闭包。也就是说,它捕获了定义它的环境。例如:
\na = 5;\nf = @(x) a * x.^2;\n
Run Code Online (Sandbox Code Playgroud)\n这里, 引用的匿名函数保存f
了调用该函数时将要计算的表达式 ,a * x.^2
以及a
调用该匿名函数时变量的定义。我们现在可以安全地删除该变量a
,并仍然进行评估f
。
笔记2
\nMATLAB 中的函数句柄引用的不是函数的特定实例,而是所有具有相同名称的重载函数。当调用句柄引用的函数时,将应用正常的重载决策。但是重载决策发生在创建函数句柄的上下文中,因此函数句柄可以引用一些私有函数,该函数在创建句柄时可见,但在计算它时不可见。
\n注3
\n不要\xe2\x80\x99t 这样做@(x) sin(x)
。这在功能上与 相同@sin
,但增加了一个间接层:调用时,必须对匿名函数进行求值。这意味着 MATLAB 必须为匿名函数创建一个工作区,并在完成后销毁它。这需要时间。调用函数的开销是 MATLAB 解释器中剩下的少数几个低效问题之一。
有关更多详细信息,请参阅有关函数句柄和匿名函数的 MATLAB 文档。
\n