MATLAB中的函数句柄 理解

简介: 函数句柄也是MATLAB中的一种常见的数据类型,它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或者函数引用(Perl)。

MATLAB中的函数句柄 理解


https://zhuanlan.zhihu.com/p/266263265


https://blog.csdn.net/kevinhg/article/details/8861774


1、何为函数句柄?


函数句柄也是MATLAB中的一种常见的数据类型,它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或者函数引用(Perl)。


它的作用是将一个函数封装成一个变量,使其能够像其它变量一样在程序的不同部分传递。。引入函数句柄可使函数调用变得更加灵活方便,极大地提高了函数调用的速度和效率。MATLAB中函数句柄的使用使得函数也可以成为输入变量,并且能很方便地调用,提高函数的可用性和独立性。


2、函数句柄的创建:


方式①:直接加@


语法:@函数名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语言解释)

在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中,已经包含了路径,


除了前面提到的用法,函数句柄在 MATLAB 中还可以应用于以下情况:


函数句柄可以用于构建可复用代码库:通过将一些常见的操作封装在函数句柄中,并编写文档以详细描述这些操作的功能和界面,你可以为特定任务构建具有广泛适用性的函数库。例如,MATLAB 提供了许多内置的函数句柄,如 sin、cos 和 sqrt 等。


函数句柄可以用于异步编程:MATLAB 内置了支持并行计算的 Parallel Computing Toolbox 工具箱,其中包括一些使用单一输入值(例如数字)进行计算的函数,以及使用不同输入参数并“二等分”计算负载的函数。在后一种情况下,你可以使用函数句柄将运行结果传递给另一个函数,以便在处理并行计算数据时执行其他操作。


函数句柄可以与 GUI 组件相结合:MATLAB 的 GUI 设计工具箱支持使用回调函数来对各种 UI 控件进行响应,包括按钮、文本框和滑块等。回调函数可以是函数文件或函数句柄,并在用户与组件交互时被自动调用,以生成所需的响应效果。


函数句柄可以用于创建可变的程序:MATLAB 使用类似于全局变量的变量作用域,通过一个基于占位符形式的定义来使程序有更大的灵活性。这种方式是通过创建匿名函数或使用真实函数句柄来实现的。


综上所述,函数句柄在 MATLAB 中可以应用于非常广泛的场景,如构建可复用代码库、异步编程、GUI 设计工具箱中的控件响应和可变程序等。如果你在 MATLAB 中想实现一项特定任务,首先考虑是否可以使用函数句柄来简化你的代码并增强其灵活性。

目录
相关文章
|
6月前
|
索引
matlab--------矩阵重构,重新排列的相关函数说明
matlab--------矩阵重构,重新排列的相关函数说明
180 0
matlab--------矩阵重构,重新排列的相关函数说明
matlab定点化_(fi函数)
matlab定点化_(fi函数)
|
1月前
|
算法 数据可视化 数据处理
MATLAB内置函数
【10月更文挑战第6天】本文详细介绍了MATLAB的内置函数和自定义函数,涵盖数学计算、矩阵操作、图形绘制等方面。通过具体代码示例,展示了如何使用内置函数和创建自定义函数,以及它们在性能、灵活性和可读性上的优劣。同时,文章还讨论了函数文件与脚本文件的区别,匿名函数和函数句柄的高级应用,帮助读者更好地利用MATLAB解决复杂问题。
41 1
|
1月前
|
存储 机器学习/深度学习 数据可视化
MATLAB脚本与函数
【10月更文挑战第4天】本文介绍了MATLAB脚本与函数的基本概念及编写方法,涵盖脚本和函数的创建、运行及优缺点,通过示例帮助初学者快速上手。同时,文章还涉及数据类型、控制结构、数据可视化、文件操作、错误处理等内容,提供了丰富的示例和学习资源,助力初学者逐步掌握MATLAB编程。
90 3
|
3月前
|
Python
【Python】实现MATLAB中计算两个矩形相交面积的rectint函数
Python中实现MATLAB中rectint函数的方法,该函数用于计算两个矩形相交区域的面积,并通过定义Rectangle类和calc_area函数展示了如何计算两个矩形的交集面积。
51 1
|
4月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于负相关误差函数的4集成BP神经网络matlab建模与仿真
**算法预览:** 图像显示无水印的2022a版MATLAB运行结果 **软件版本:** MATLAB 2022a **核心代码片段:** 省略展示 **理论概述:** NCL集成BP网络利用负相关提升泛化,结合多个弱模型减少错误关联。通过λ参数控制模型间负相关程度,λ&gt;0增强集成效果,提高预测准确性和系统稳健性。
|
5月前
|
算法 数据可视化 数据挖掘
MATLAB中常用的数学函数及其应用示例
MATLAB中常用的数学函数及其应用示例
|
6月前
|
Serverless
基于Logistic函数的负荷需求响应(matlab代码)
基于Logistic函数的负荷需求响应(matlab代码)
|
6月前
|
数据安全/隐私保护
地震波功率谱密度函数、功率谱密度曲线,反应谱转功率谱,matlab代码
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
|
6月前
|
调度
知识分享|分段函数线性化及matlab测试
知识分享|分段函数线性化及matlab测试

热门文章

最新文章

下一篇
无影云桌面