MATLAB 中的匿名函数和函数句柄有什么区别?

Cri*_*ngo 5 matlab lambda function handle anonymous-function

我听说这两个术语,匿名函数函数句柄被用来指代类似f = @(x) x.^2MATLAB 中的东西。但后来我也听说这些术语含义不同。这两个术语有何不同?

Cri*_*ngo 8

函数句柄是对函数的引用。例如,@sin是函数 的句柄sin。这是一个可以像函数一样进行计算的变量,但也可以将其作为参数传递给另一个函数。例如:

\n
integral(@sin, 0, 1)\n
Run Code Online (Sandbox Code Playgroud)\n

这里我们将函数sin作为参数传递给integral. 我们需要特殊的语法@sin来执行此操作,因为在 MATLAB 中sin本身与 相同sin(),即我们调用不带参数的函数。

\n

所以

\n
f = @sin\n
Run Code Online (Sandbox Code Playgroud)\n

使变量f引用函数sinf是一个函数句柄。

\n

匿名函数是没有名称的函数。这个概念在其他一些语言中称为“lambda 表达式”或“函数文字”。@(x) x.^2是一个匿名函数。我们不能像处理其他函数那样通过它的名称来引用它,所以我们只能通过它的句柄来引用它。所以这个表达式返回新创建的匿名函数的句柄。

\n

因此,表达式

\n
f = @(x) x.^2\n
Run Code Online (Sandbox Code Playgroud)\n

两者都创建一个匿名函数,并创建f一个引用该匿名函数的函数句柄。

\n
\n

注1

\n

在 MATLAB 中,匿名函数也是一个闭包。也就是说,它捕获了定义它的环境。例如:

\n
a = 5;\nf = @(x) a * x.^2;\n
Run Code Online (Sandbox Code Playgroud)\n

这里, 引用的匿名函数保存f了调用该函数时将要计算的表达式 ,a * x.^2以及a调用该匿名函数时变量的定义。我们现在可以安全地删除该变量a,并仍然进行评估f

\n
\n

笔记2

\n

MATLAB 中的函数句柄引用的不是函数的特定实例,而是所有具有相同名称的重载函数。当调用句柄引用的函数时,将应用正常的重载决策。但是重载决策发生在创建函数句柄的上下文中,因此函数句柄可以引用一些私有函数,该函数在创建句柄时可见,但在计算它时不可见。

\n
\n

注3

\n

不要\xe2\x80\x99t 这样做@(x) sin(x)。这在功能上与 相同@sin,但增加了一个间接层:调用时,必须对匿名函数进行求值。这意味着 MATLAB 必须为匿名函数创建一个工作区,并在完成后销毁它。这需要时间。调用函数的开销是 MATLAB 解释器中剩下的少数几个低效问题之一。

\n
\n

有关更多详细信息,请参阅有关函数句柄匿名函数的 MATLAB 文档。

\n