MATLAB函数句柄的创建和使用(非常详细)
在 MATLAB 中,对函数的调用方法分为直接调用法和间接调用法。
对于直接调用法,被调用的函数通常被称为子函数。但是子函数只能被与其 M 文件同名的主函数或 M 文件中的其他函数调用,一个文件中只能有一个主函数。
使用函数句柄对函数进行调用可以避免上述问题。函数句柄提供了一种间接调用函数的方法。创建函数句柄需要用到操作符 @。
MATLAB 函数库提供的各种 M 文件中的函数和使用者自主编写的程序的内部函数,都可以被创建函数句柄,从而可以通过函数句柄来实现对这些函数的间接调用。
创建函数句柄的一般语法形式如下:
例如,
在通过函数句柄调用函数时,也需要指定函数的输入参数。例如,可以通过 F_Handle(arg1, arg2, …, argn) 这样的调用格式来调用具有多个输入参数的函数。
对于那些没有输入参数的函数,在使用函数句柄调用时,在函数句柄变量之后的圆括号中不填写变量名即可,即 F_Handle()。
【实例】函数句柄的创建与调用。在命令行窗口中输入以下语句,并显示相应的输出结果。
函数句柄的简单操作函数如下表所示:
【实例】函数句柄的基本操作。在命令行窗口中输入以下语句,并显示相应的输出结果。
继续在命令行窗口中输入:
对于直接调用法,被调用的函数通常被称为子函数。但是子函数只能被与其 M 文件同名的主函数或 M 文件中的其他函数调用,一个文件中只能有一个主函数。
使用函数句柄对函数进行调用可以避免上述问题。函数句柄提供了一种间接调用函数的方法。创建函数句柄需要用到操作符 @。
MATLAB 函数库提供的各种 M 文件中的函数和使用者自主编写的程序的内部函数,都可以被创建函数句柄,从而可以通过函数句柄来实现对这些函数的间接调用。
创建函数句柄的一般语法形式如下:
Function_Handle = @Function_Filename;其中各参数的含义如下:
- Function_Filename 是函数对应的 M 文件的名称或 MATLAB 内部函数的名称;
- @ 是句柄创建操作符;
- Function_Handle 变量保存了这一函数句柄,并在后续的运算中作为数据流进行传递。
例如,
F_Handle=@cos
就创建了 MATLAB 内部函数 cos 的句柄,并将其保存在 F_Handle 变量中,在后续的运算过程中可以通过 F_Handle(x) 来实现 cos(x) 的功能。在通过函数句柄调用函数时,也需要指定函数的输入参数。例如,可以通过 F_Handle(arg1, arg2, …, argn) 这样的调用格式来调用具有多个输入参数的函数。
对于那些没有输入参数的函数,在使用函数句柄调用时,在函数句柄变量之后的圆括号中不填写变量名即可,即 F_Handle()。
【实例】函数句柄的创建与调用。在命令行窗口中输入以下语句,并显示相应的输出结果。
>> F_Handle = @cos F_Handle = 包含以下值的 function_handle: @cos >> x = 0 : 0.25 * pi : 2 * pi; >> F_Handle( x ) % 通过函数句柄调用函数 ans = 1.0000 0.7071 0.0000 -0.7071 -1.0000 -0.7071 0.0000 0.7071 1.0000MATLAB 库函数中提供了大量关于函数句柄的操作函数,将函数句柄的功能与其他数据类型联系起来,扩展了函数句柄的应用。
函数句柄的简单操作函数如下表所示:
函数名称 | 函数功能 |
---|---|
s=functions(fh) | 返回一个结构体 s,存储函数的名称、类型(simple 或 overloaded),以及函数 M 文件的位置 |
c=func2str(fh) | 将函数句柄 fh 转换为函数名称字符串 |
fh=str2func(str) | 将字符串 str 代表的函数转换为函数句柄 |
save (fname.mat, fh) | 将函数句柄 fh 保存在 *.mat 文件中 |
load (fname.mat, fh) | 把 *.mat 文件中存储的函数句柄 fh 加载到工作区中 |
isa(var, 'function_handle') | 检测变量 var 是否是函数句柄 |
isequal(fhA, fhB) | 检测两个函数句柄 fhA、fhB 是否对应同一个函数 |
【实例】函数句柄的基本操作。在命令行窗口中输入以下语句,并显示相应的输出结果。
>> F_Handlea = @exp F_Handlea = 包含以下值的 function_handle: @exp >> F_Handleb = @log F_Handleb = 包含以下值的 function_handle: @log >> functions(F_Handlea) ans = 包含以下字段的 struct: function: 'exp' type: 'simple' file: ''
继续在命令行窗口中输入:
>> isa(F_Handlea, 'function_handle') % 判断 F_Handlea 是否是函数句柄 ans = logical 1 >> isequal(F_Handlea, F_Handleb) % 判断两个函数句柄是否对应同一个函数 ans = logical 0