Matlab中的函数句柄@

本文详述MATLAB中的句柄函数概念,包括句柄函数的两种主要语法及使用方式,通过实例演示如何创建、处理句柄函数,并介绍常用的句柄处理函数,帮助读者掌握句柄函数的应用技巧。


本系列文章由 @yhl_leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/50699990


@是Matlab中的句柄函数的标志符,即间接的函数调用方法。

1 句柄函数

主要有两种语法:

  • handle = @functionname
  • handle = @(arglist)anonymous_function

handle = @functionname:返回一个特别的Matlab函数句柄,它提供了一种间接访问函数的方式,也被成为函数的函数(function functions),是一种标准的Matlab数据类型。在C/C++中,有个类似的用法称为引用(使用标识符&),引用只是它绑定的对象的另一个名字,作用在应用上的所有操作事实上都会作用在该引用绑定的对象上。Matlab里句柄函数,与前面讲得引用有些类似,我们通过语句handle = @functionname给名为functionname的函数取了个别名handle,也就是说你既可以用函数functionname实现你要实现的功能,也可以使用handle实现同样的功能。在Python里,你大可直接用变量赋值的方式handle = functionname达到这一目的。

基本用法如下:

% .m 文件函数句柄
>>fh_mFile = @humps
fh_mFile = 
    @humps

% 内置函数句柄
>>fh_builtin = @cos
fh_builtin = 
    @cos
>>fh_builtin(pi)
ans =
    -1

handle = @(arglist)anonymous_function:也称为匿名函数,@左边为一个函数句柄,@后定义了匿名函数的输入参数(多个参数用逗号分隔开),最后一部分为匿名函数的表达式。基本用法如下:

>>sqr = @(x) x.^2
>>a = sqr([1, 2, 3])
a =
     1     4     9

2 句柄处理函数

这里列举四个常见的句柄处理函数,如下表:

函数说明
functions返回一个句柄的详细信息
str2func将一个函数名作为字符串传递给此函数,创建该函数的函数句柄
func2str从一个函数句柄中提取函数名,对于内置函数或m文件函数句柄,返回函数的名称,对于匿名函数,返回其表达式
structfun将句柄结构体数组的每一个句柄函数的依次作用于数组,返回每个句柄函数的作用于数组的值


逐一给出示例:

>> functions(sqr)
ans = 
     function: '@(x)x.^2'
         type: 'anonymous'
         file: ''
    workspace: {[1x1 struct]}


>>fh2 = str2func('sqr')
fh2 = 
    @sqr

>> func2str(fh2)
ans =
sqr
>> func2str(sqr)
ans =
@(x)x.^2

>> S.a = @sin; S.b = @cos; S.c = @tan;
>> structfun(@(x)x(linspace(1, 4, 3)), S, 'UniformOutput', false)
ans = 
    a: [0.8415 0.5985 -0.7568]
    b: [0.5403 -0.8011 -0.6536]
    c: [1.5574 -0.7470 1.1578]
### MATLAB 函数句柄(Function Handle)的概念 函数句柄MATLAB 中的一种数据类型,用于引用函数并提供间接调用函数的能力。它包含了调用函数所需的信息,包括函数名称、路径以及函数的上下文环境。通过函数句柄,可以将函数作为参数传递给其他函数、构造匿名函数,甚至可以在不同目录中调用函数,而无需复制函数文件,因为句柄中已经包含了路径信息[^4]。 ### 函数句柄的创建与使用 函数句柄的创建使用 `@` 操作符。可以为 MATLAB 内置函数、用户自定义的 M 文件函数、子函数、私有函数以及匿名函数创建句柄。例如,为一个简单的加法函数创建句柄如下: ```matlab f = @sin; result = f(pi/2); ``` 上述代码创建了对内置函数 `sin` 的引用,并计算了 $ \sin(\pi/2) $ 的值。对于用户自定义的函数,例如 `add.m` 文件中的函数,也可以创建句柄: ```matlab f = @add; result = f(2, 3); ``` 其中 `add.m` 文件定义如下: ```matlab function c = add(a, b) c = a + b; end ``` ### 函数句柄的优势 函数句柄的主要优势在于允许间接调用函数,从而提高代码的灵活性和可重用性。具体包括: - **传递函数给其他函数**:函数句柄可以作为参数传递给其他函数,例如 `integral` 或 `fzero`,用于数值积分或求根运算。 - **减少函数定义数量**:通过匿名函数句柄,可以避免创建多个独立的 M 文件来实现简单的函数逻辑。 - **改善性能**:在多次调用函数的场景中,使用函数句柄可以减少函数查找的开销,提高执行效率。 - **跨目录调用函数**:即使切换了当前工作目录,函数句柄依然可以调用之前目录中的函数,因为它保存了函数的路径信息[^4]。 ### 匿名函数函数句柄 MATLAB 还支持通过匿名函数直接创建函数句柄,适用于简单的数学表达式或逻辑处理。例如,定义一个多项式函数: ```matlab f = @(x) x.^2 + 2*x + 1; result = f(3); ``` 匿名函数非常适合在脚本中快速定义临时函数,而无需单独创建 M 文件。 ### 示例:函数句柄在数值积分中的应用 函数句柄的一个典型应用场景是数值积分。例如,使用 `integral` 函数计算 $ \int_0^1 x^2 \, dx $: ```matlab f = @(x) x.^2; result = integral(f, 0, 1); ``` ### 示例:函数句柄在绘图中的应用 结合 `fplot` 函数,可以方便地绘制由函数句柄定义的数学函数: ```matlab f = @(x) sin(x) .* cos(2*x); fplot(f, [0, 2*pi]); ``` ### 示例:函数句柄在回调函数中的应用 在图形用户界面(GUI)开发中,函数句柄常用于定义回调函数。例如,在按钮点击事件中指定一个函数来响应: ```matlab uicontrol('Style', 'pushbutton', 'String', 'Click Me', 'Callback', @myCallback); ``` 其中 `myCallback` 是一个函数,用于处理按钮点击事件。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值