创建函数句柄
您可以为已命名函数和匿名函数创建函数句柄。您可以将多个函数句柄存储在数组中,保存并加载它们,方法与对任何其他变量一样。
什么是函数句柄?
函数句柄是一种存储指向函数的关联关系的 MATLAB® 数据类型。间接调用函数使您在调用该函数时无需考虑调用位置。函数句柄的典型用法包括:
将一个函数传递到另一个函数(通常称为复合函数)。例如,将函数传递到
integral
和fzero
等积分和优化函数。指定回调函数(例如,响应 UI 事件或与数据采集硬件交互的回调)。
构造以内联方式定义而非存储在程序文件(匿名函数)中的函数的句柄。
从主函数外调用局部函数。
您可以使用 isa
(h,'function_handle')
来查看变量 h
是否为函数句柄。
创建函数句柄
通过在函数名称前添加一个 @
符号来为函数创建句柄。例如,如果您有一个名为 myfunction
的函数,请按如下所示创建一个名为 f
的句柄:
f = @myfunction;
使用句柄调用函数的方式与直接调用函数一样。例如,假设您有一个名为 computeSquare
的函数,该函数定义为:
function y = computeSquare(x) y = x.^2; end
创建句柄并调用该函数以计算 4 的平方。
f = @computeSquare; a = 4; b = f(a)
b = 16
如果该函数不需要任何输入,则您可以使用空括号调用该函数,例如
h = @ones; a = h()
a = 1
如果不使用括号,则该赋值会创建另一个函数句柄。
a = h
a = @ones
函数句柄是您可传递给其他函数的变量。例如,计算 x2 在区间 [0,1] 上的积分。
q = integral(f,0,1);
函数句柄会存储其绝对路径,因此如果您有有效句柄,则可以从任意位置调用该函数。您不必在创建句柄时指定函数路径,只需指定函数名。
创建函数句柄时应牢记以下几点:
名称长度 - 函数名称(包括包名称和类名称)的每个部分都必须小于
namelengthmax
指定的数值。否则 MATLAB 会截断该名称的后面一部分。范围 - 在您创建句柄时,该函数必须处于范围内。因此,该函数必须在 MATLAB 路径上或位于当前文件夹中。或者,对于局部或嵌套函数句柄,这些函数必须位于当前文件中。
优先级 - 当多个函数采用同一名称时,MATLAB 会使用与调用函数相同的优先级规则来定义函数句柄。有关详细信息,请参阅函数优先顺序。
重载 - 当调用带一个或多个参数的函数句柄时,MATLAB 确定主导参数。如果主导参数是对象,MATLAB 确定该对象的类是否有重载与函数句柄的关联函数同名的方法。如果有,则调用该对象的方法,而不是关联的函数。
匿名函数
您可以创建指向匿名函数的句柄。匿名函数是基于单行表达式的 MATLAB 函数,不需要程序文件。构造指向匿名函数的句柄,方法是定义 anonymous_function
函数主体,以及指向匿名函数 arglist
的以逗号分隔的输入参数列表。语法为:
h = @(arglist)anonymous_function
例如,创建一个指向用于计算平方数的匿名函数的句柄 sqr
,并使用其句柄调用该匿名函数。
sqr = @(n) n.^2; x = sqr(3)
x = 9
有关详细信息,请参阅匿名函数。
由函数句柄组成的数组
您可以通过将函数句柄收集到一个元胞数组或结构体数组中,来创建由这些函数句柄组成的数组。例如,使用元胞数组:
C = {@sin, @cos, @tan}; C{2}(pi)
ans = -1
或使用结构体数组:
S.a = @sin; S.b = @cos; S.c = @tan; S.a(pi/2)
ans = 1
保存和加载函数句柄
您可以在 MATLAB 中保存和加载函数句柄,就像处理任何其他变量一样。换言之,使用 save
和 load
函数。如果保存函数句柄,MATLAB 会保存绝对路径信息。您可以从 MATLAB 能够到达的任何位置调用该函数,只要该函数的文件仍存在于此位置。如果文件位置或文件名在您创建句柄后进行了更改,则该句柄将变得无效。如果句柄无效,MATLAB 可能会在您加载文件时显示警告。当您调用无效句柄时,MATLAB 将引发错误。
另请参阅
str2func
| func2str
| functions
| isa
| function_handle