函数句柄是一种特殊的数据类型,它提供了间接调用的函数的方法,类似于c语言中的指针,只不过这里是指向一个函数。
函数句柄包含了函数的路径、函数名、类型及可能存在的重载方法,必须通过专门的定义创建,创建函数句柄需要用到的操作符是@,格式为
Fhandle=@functionname
例如:
m=[3 2 0;-5 0 7;0 0 1];
[row,col,val]=find(m)
f=@find;[row,col,val]=f(m)
这两条语句得到的结果是一样的。
比如定义f(x)=x^2,可以写为
f=@(x)(x.^2)
其中@(x)(x.^2)就是匿名函数,第一个括号里面是自变量,第二个括号里面是表达式,@是函数指针
f=@(x)(x.^2)表示将匿名函数@(x)(x.^2)赋值给f,于是f就表示该函数。
于是f(2)=2.^2=4;f(1:3)=[1:3].^2=[14 9]等等
再比如:f=@(x)acos(x)表示什么意思?
f为函数句柄,@是定义句柄的运算符。f=@(x)acos(x)相当于建立了一个函数文件:
% f.m
function y=f(x)
y=acos(x);
若有下列语句:
xsqual=@(x)1/2.*(x==-1/2)+1.*(x>-1/28&x<1/2)+1.2.*(x==-1/2);
则相当于建立了一个函数文件:
% xsqual.m
function y=xsqual(x)
y=1/2.*(x==-1/2)+1.*(x>-1/28&x<1/2)+1.2.*(x==-1/2);
定义匿名函数时也可以调用别的匿名函数,比如
f1=@(x,y)(x.^2+y.^2)
定义了函数x^2+y^2
f2=@(t)(f1(t,2))
定义了函数t^2+4
f3=@(x)(f1(x(1),x(2)))
定义了函数x(1)^2+x(2)^2
使用匿名函数时一定要注意函数本身的参数形式,如
f1(2,3)
表示2^2+3^2
f2(3)=3
表示3^2+4
f3([1,2])
表示1^2+2^2
说白了就是函数指针,当然这样做有它的好处
①提高运行速度。因为matlab对函数的调用每次都是要搜索所有的路径,从set path中我们可以看到,路径是非常的多的,所以如果一个函数在你的程序中需要经常用到的话,使用函数句柄,对你的速度会有提高的。
②使用可以与变量一样方便。比如说,我再这个目录运行后,创建了本目录的一个函数句柄,当我转到其他的目录下的时候,创建的函数句柄还是可以直接调用的,而不需要把那个函数文件拷贝过来。因为你创建的function handles中,已经包含了路径,