# MATLAB中的函数句柄 理解
https://zhuanlan.zhihu.com/p/266263265
## 1、何为函数句柄?
函数句柄也是MATLAB中的一种常见的数据类型,它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或者函数引用(Perl)。
它的作用是将一个函数封装成一个变量,使其能够像其它变量一样在程序的不同部分传递。。引入函数句柄可使函数调用变得更加灵活方便,极大地提高了函数调用的速度和效率。MATLAB中函数句柄的使用使得函数也可以成为输入变量,并且能很方便地调用,提高函数的可用性和独立性。
## 2、函数句柄的创建:
~~~matlab
方式①:直接加@
语法:@函数名fun1 = @sin;
方式②:str2func函数
语法:str2fun(‘函数名’)
fun2 = str2func(‘cos’);
方式③:str2func函数
语法:@(参数列表)单行表达式
fun3 = @(x, y)x.^2 + y.^2;
3、函数句柄的调用:
假定一个函数的调用格式为:[y1,y2,…,yn] = FunctionName(x1,x2,…,xm)
该函数通过以下方式构建函数句柄:Hfunction = @FunctionName
则通过函数句柄实现函数运算的调用格式是:直接调用 Hfunction (x1,x2,…,xm) 或者 [y1,y2,…,yn]=feval(Hfunction,x1,x2,…,xm)
例如:
句柄是matlab语言独有的参数,相当于C语言的指针。
句柄分为多种,如函数柄,对象柄,图形柄等。
图形句柄就指一个图形,在生成图形时同时得到一代号,如语句 h=plot(x,y),h 就是一个图形句柄,在后来的某一个地方就可用h代表这个图,如 set(h,…),对这个图形进行再设置。
1.函数句柄
函数句柄简介:函数句柄(function handle)是MATLAB中的一类特殊的数据结构,它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或者函数引用(Perl)。作用是将一个函数封装成一个变量,使其能够像其它变量一样在程序的不同部分传递。
句柄创建:
(1)fun1=@sin;
(2)fun2=str2fun(‘cos’);
(3)匿名函数:fun3=@(x,y)x2+y2;
函数句柄应用:函数句柄作为函数参数;利用函数句柄绘图;利用函数句柄滤波等
比如定义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=[1 4 9]等等
定义匿名函数调用别匿名函数比
f1=@(x,y)(x.2+y.2)
定义函数x2+y2
f2=@(t)(f1(t,2))
定义函数t^2+4
f3=@(x)(f1(x(1),x(2)))
定义函数x(1)2+x(2)2
使用匿名函数定要注意函数本身参数形式
f1(2,3)
表示22+32
f2(3)=3
表示3^2+4
f3([1,2])
表示12+22
说白函数指针
handle=@functionname
返指向制定MATLAB函数句柄
函数句柄指指向函数量句柄函数获函数句柄存
~~~
图形句柄和图形之间是一种一一对应关系,简单的说图形句柄就是指向了这个图形的一个变量,通过它可以设定该图形的各种属性。
## MATLAB函数句柄怎么理解(拿C语言解释)
~~~matlab
在C语言中,函数指针是一种指向函数的指针变量。类似地,在MATLAB中,函数句柄也是一种指向函数的引用。换句话说,函数句柄就是一个特殊类型的变量,可以用来表示一个函数,并且可以通过该变量来调用这个函数。
使用函数句柄,你可以像调用普通函数一样,对其进行参数传递和调用。以MATLAB为例,假设有一个名为`myFunc`的函数:
```
function y = myFunc(x)
y = sin(x);
end
```
我们可以将该函数赋值给一个句柄 例如:
```
handle = @myFunc;
```
现在,`handle`就成了一个函数句柄,你可以使用它来调用`myFunc`函数:
```
x = 0:pi/4:pi;
y = handle(x);
disp(y);
```
上述代码中,我们将一个数组传递给函数句柄,并将返回的结果存储在`y`中。然后,我们将结果输出到命令行窗口。
在C语言中,函数指针可以用于回调函数和动态库开发等多种场合。同样,在MATLAB中,函数句柄也可以用于编写高级算法、用户界面设计以及开发独立的工具箱等很多情况下。
在MATLAB中,函数句柄可以用于许多现成的函数,如 `plot`、`fplot`、`fzero` 和 `fsolve` 等函数。函数句柄的使用不仅仅局限于调用该函数,还可以将其作为参数传递给其他函数。
例如,我们有一个自定义的函数 `myFunc` 及其函数句柄 `handle`,并且想在一定区间内求解 `myFunc` 在x上的零点。我们可以使用 `fzero` 函数通过 handle 来进行计算:
```
handle = @myFunc;
x0 = 1;
fzero(handle,x0)
```
需要注意:函数句柄只能指向那些已经存在于 MATLAB 的函数,所以不能将其用于指向 C 或者 Fortran 语言中的函数。但如果你要使用 C/C++ 中的函数,你可以将它们编译成动态库或 MEX 文件的形式,然后在 MATLAB 中加载这些文件并创建相应的句柄以供调用。
总之,MATLAB 里的函数句柄就是一个可以代表函数的变量,它可以方便地操作和传递函数,并且增加可读性和代码的灵活度。
除了上述的功能,函数句柄在 MATLAB 中还可以用来实现一些进阶的功能,例如:
1. 函数句柄可以用于创建匿名函数:MATLAB 中使用 `@` 符号可以创建简单的匿名函数。如果你只需要临时定义一个函数来计算参数或者数据,那么函数句柄就可以派上用场。例如:
```
handle = @(a,b) sum(a+b);
result = handle(2,3); % 返回 5
```
2. 函数句柄可以用作搜索和排序算法的回调函数:许多内置函数提供了“回调函数”选项,用于自定义特定操作的行为。一个惯用方法是使用函数句柄将这些函数传递给其他函数。例如:
```
x = randi(100,1,10);
sortedX = sort(x,'descend', @myComparisonFcn);
```
这里,我们在对 `x` 数组进行排序时,提供了一个自定义的比较函数 `myComparisonFcn` 的函数句柄。
3. 函数句柄可以用做动态修改程序行为的工具:很多布尔型选项都支持使用函数句柄来设置程序行为,如 `while`、`if` 和 `for` 等语句中的条件判断。例如:
```
stop = false;
while ~stop
% 进行某些操作
if userPressedButton()
stop = true;
end
end
```
这里使用了函数句柄 `userPressedButton()`,它被用来检测用户是否按下了某个按钮,并修改程序运行的流程。如果按钮按下,则设置 `stop` 为 `true`,从而结束循环。
综上所述,函数句柄是 MATLAB 中一个非常强大的工具,它可以使代码更加灵活和易于维护。
~~~
问: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);
详细说明:
1、函数句柄/function_handle(@):是一种间接调用函数的方式。
2、语法:handle=@functionname or handle=@(arglist)anonymous_function
3、描述:函数句柄(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其他数据类型一样进行操作。
4、函数句柄的好处
①提高运行速度。因为matlab对函数的调用每次都是要搜索所有的路径,从set path中我们可以看到,路径是非常的多的,所以如果一个函数在你的程序中需要经常用到的话,使用函数句柄,对你的速度会有提高的。
②使用可以与变量一样方便。比如说,我再这个目录运行后,创建了本目录的一个函数句柄,当我转到其他的目录下的时候,创建的函数句柄还是可以直接调用的,而不需要把那个函数文件拷贝过来。因为你创建的function handles中,已经包含了路径,
————————————————
版权声明:本文为CSDN博主「kevinhg」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kevinhg/article/details/8861774
除了前面提到的用法,函数句柄在 MATLAB 中还可以应用于以下情况:
1. 函数句柄可以用于构建可复用代码库:通过将一些常见的操作封装在函数句柄中,并编写文档以详细描述这些操作的功能和界面,你可以为特定任务构建具有广泛适用性的函数库。例如,MATLAB 提供了许多内置的函数句柄,如 `sin`、`cos` 和 `sqrt` 等。
2. 函数句柄可以用于异步编程:MATLAB 内置了支持并行计算的 Parallel Computing Toolbox 工具箱,其中包括一些使用单一输入值(例如数字)进行计算的函数,以及使用不同输入参数并“二等分”计算负载的函数。在后一种情况下,你可以使用函数句柄将运行结果传递给另一个函数,以便在处理并行计算数据时执行其他操作。
3. 函数句柄可以与 GUI 组件相结合:MATLAB 的 GUI 设计工具箱支持使用回调函数来对各种 UI 控件进行响应,包括按钮、文本框和滑块等。回调函数可以是函数文件或函数句柄,并在用户与组件交互时被自动调用,以生成所需的响应效果。
4. 函数句柄可以用于创建可变的程序:MATLAB 使用类似于全局变量的变量作用域,通过一个基于占位符形式的定义来使程序有更大的灵活性。这种方式是通过创建匿名函数或使用真实函数句柄来实现的。
综上所述,函数句柄在 MATLAB 中可以应用于非常广泛的场景,如构建可复用代码库、异步编程、GUI 设计工具箱中的控件响应和可变程序等。如果你在 MATLAB 中想实现一项特定任务,首先考虑是否可以使用函数句柄来简化你的代码并增强其灵活性。