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.0000
MATLAB 库函数中提供了大量关于函数句柄的操作函数,将函数句柄的功能与其他数据类型联系起来,扩展了函数句柄的应用。函数句柄的简单操作函数如下表所示:
| 函数名称 | 函数功能 |
|---|---|
| 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
ICP备案:
公安联网备案: