句柄是一种间接调用函数的方式。
handle=@functionname
handle=@(arglist)anonymous_function
函数句柄(function handle)是一种能够提供函数间接调用的matlab value。你可以通过传递句柄来调用各种其他功能。你也可以将句柄存储到数据结构中备用(例如Handle Graphic 回调)。句柄是matlab的标准数据类型之一。
当创建句柄时,你所指定的函数必须在matlab搜索路径之中,并且必须在创建语句的scope之中。例如,只要在定义子函数的文件之中,你句可以为这个子函数创建句柄。这些条件不适用于evaluate函数句柄。例如,你可以在一个单独(out-scope)通过句柄执行一个子函数,这要求句柄是在in-scope创建的。
handle=@(arglist)anonymous_function用来创建匿名函数(anonymous function)并返回该匿名函数的句柄。括号右边的函数体是单个的matlab语句(statement)或者matlab命令。arglist是一个用逗号“,”分隔的输入变量列表。该函数通过句柄handle执行。
函数句柄是标准的matlab数据类型。因此,你可以像matlab其他数据类型一样进行操作。下面是在结构体和cell array中使用function的例子:
S.a=@sin;S.b=@cos;S.c=@tan C={@sin,@cos,@tan}
然而,句柄矩阵或句柄数组是不支持的。例如:
>> A=[@sin @cos @tan]
??? Error using ==> horzcat
Nonscalar arrays of function handles are not allowed; use cell arrays instead.
对于非重载函数、子函数和私有函数(private functions),函数句柄只是引用由语法@functionname指定的函数。当通过句柄evaluate重载函数时,句柄的参数决定matlab调用的实际函数。
使用isa(h,'function_handle')可以判断变量h是否是函数句柄。
下面这个例子为humps函数创建句柄并将其赋值给变量fhandle。
fhandle=@humps;
将句柄像传递其他参数一样传递给另一个函数。这个例子将你刚创建的句柄传递给函数fminbnd,它在区间[0.3,1]上求最小值:
>> x=fminbnd(fhandle,0.3,1); >> x x = 0.6370
fminbnd函数evaluate句柄@humps。fminbnd函数的一小部分源码如下所示。在行1,输入参数funfcn接收传递过来的句柄@humps,行113的语句evaluate此句柄。
1 function [xf,fval,exitflag,output] = ... fminbnd(funfcn,ax,bx,options,varargin) . . . 113 fx = funfcn(x,varargin{:});
下面的语句创建一个匿名函数计算一个数的平方。当调用此函数时,matlab将你传递的值赋给变量x,然后再式子x.^2中使用x。
sqr=@(x)x.^2;
运算符@为此函数创建了句柄并将其赋值给输出变量sqr。像任何函数句柄一样,你执行句柄所代表的函数应指定组成句柄的变量,其实就是在后面跟着括号中用逗号“,”隔开的参数。语法如下:
fhandle(arg1, arg2, ..., argN)
要执行上面定义的sqr函数,输入
>> a=sqr(5) a = 25
由于sqr是函数句柄,你可以将它传递到其他函数的参数列表中。下面的代码将sqr匿名函数传递给matlab函数quad来计算它从0到1的积分:
>> quad(sqr,0,1) ans = 0.3333
Matlab R2010的help文档: