首页 > 其他分享 >MATLAB中的函数句柄 理解

MATLAB中的函数句柄 理解

时间:2023-06-07 21:01:27浏览次数:55  
标签:调用 handle 函数 句柄 可以 MATLAB

# 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 中想实现一项特定任务,首先考虑是否可以使用函数句柄来简化你的代码并增强其灵活性。





标签:调用,handle,函数,句柄,可以,MATLAB
From: https://blog.51cto.com/u_16076194/6435109

相关文章

  • 基础版EMD分解函数Matlab程序
    不调用matlab自带emd(x)函数,将其内容简化为如下部分EMD分解基础步骤可以参见:[意念回复:经验模态分解(EMD)](https://blog.csdn.net/weixin_39910711/article/details/124661068?spm=1001.2014.3001.5506)原始程序为百度搜索,结合ChatGPT后给出相应注释。%EMD分解程序%作者:CSDN:Mis......
  • 函数
       ......
  • 9、hive的explode、Lateral View侧视图、聚合函数、窗口函数、抽样函数使用详解
    ApacheHive系列文章[1、apache-hive-3.1.2简介及部署(三种部署方式-内嵌模式、本地模式和远程模式)及验证详解][2、hive相关概念详解--架构、读写文件机制、数据存储][3、hive的使用示例详解-建表、数据类型详解、内部外部表、分区表、分桶表][4、hive的使用示例详解-事务表、......
  • Matlab GUI编程入门
    先吐槽下,我看得是出版社的优秀教材,虽说是二等奖,《Matlab与控制系统仿真实践》第3版,北京航空航天大学出版社赵广元编著,想着入门,找本国内的书快速入门。谁知道一个上午就这么过去了。以一个控制系统典型环节演示为例,课本从P95开始:一、准备工作,设置下显示组件的名称与图标HOME-......
  • PYQT内setFocus函数的作用
    setFocus()函数是QWidget类的一个成员函数,用于将焦点设置到该QWidget上。当一个QWidget被设置为焦点时,它将成为键盘事件的接收者,可以响应键盘事件。在PyQt5中,可以使用setFocus()函数将焦点设置到任何QWidget上,例如QPushButton、QLineEdit、QTextEdit等。当用户点击这些控件时,它们......
  • 【体验有奖】玩转 AIGC,函数计算 x 通义千问预体验,一键部署 AI 应用赢 Airpods
    玩转AIGC,基于函数计算FC部署通义千问预体验从文字生成到图片生成,AIGC的创造力让人惊叹,更多的人开始探索如何使用AI提高生产效率,激发更多创作潜能,然而在实际应用中,AI技术的高门槛让很多人望而却步,普通开发者和零编程经验的人是否也能简单快速地部署一个AI模型应用,享受到科......
  • C++ 友元函数
    类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友......
  • 006 数据库学习笔记--字符串操作函数 + 索引
    常用字符串操作函数:--返回字符串中指定的子串出现的开始位置(索引从1开始)selectCHARINDEX('34','1234567890123')asstartIndex--返回字符串中指定的子串出现的开始位置(索引从1开始,字串前必须加%)selectPATINDEX('%34%','1234567890123')asstartIndex--大小写转化s......
  • js 获取函数的调用者
    办法严格模式arguments.callee.caller不给使用了歪路子截取newError()的报错字符串stackconstgetCall=()=>{letcallArr=newError().stack.split("\n");callArr.splice(0,3);constpattern=/at(\w+)/;callArr=callArr.map(it=>(it.match(patt......
  • 7、hive shell客户端与属性配置、内置运算符、函数(内置运算符与自定义UDF运算符)
    ApacheHive系列文章1、apache-hive-3.1.2简介及部署(三种部署方式-内嵌模式、本地模式和远程模式)及验证详解2、hive相关概念详解--架构、读写文件机制、数据存储3、hive的使用示例详解-建表、数据类型详解、内部外部表、分区表、分桶表4、hive的使用示例详解-事务表、视图、物......