1.函数句柄的创建


函数句柄(function handle)是MATLAB中的一类特殊的数据结构,它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或者函数引用(Perl)。作用是将一个函数封装成一个变量,使其能够像其它变量一样在程序的不同部分传递。

MATLAB中的函数句柄在调用时和普通函数没有任何区别,下面展示几种创建函数句柄的方式,最后通过函数句柄调用函数。

% 函数句柄的创建% 

% 方式1 : 直接加@
% 语法:@函数名
fun1 = @sin

% 方式2: str2func函数
% 语法:str2fun('函数名')
fun2 = str2func('cos')

% 方式3: 匿名函数
% 语法:@(参数列表)单行表达式
fun3 = @(x, y)x.^2 + y.^2

% 函数句柄的调用:
fun1(pi)
fun2(pi)
fun3(1,2)

调用后的结果如下:

>> fun1(pi)

ans =

   1.2246e-16

>> fun2(pi)

ans =

    -1

>> fun3(1,2)

ans =

     5

2.将函数句柄作为函数参数

函数对象的经典应用情境之一就是排序(Sorting),即为一列未知类型的数组提供自定义的排序规则。下面我将实现一个函数super_sort,接收两个参数,第一个参数为待排序的数组,第二个参数是一个对原始数据的变换函数。super_sort能够对原始数据按照变换后的结果进行排序,并返回排好序的原始数据。

%文件名:super_sort.m

function sorted = super_sort(arr, fh)
transformed = fh(arr);% 对原始数组进行变换
[~, index] = sort(transformed); % 获得排序后的原数组位置索引
sorted = arr(index); % 返回排序后的原数组
end

测试脚本:

arr = round(randn(8, 1) * 10);

% 将arr按照其绝对值大小排序
super_sort(arr, @abs)

% 将arr按照sin(x)的结果排序                                             
super_sort(arr, @sin)

3.利用函数句柄进行画图

借助函数句柄,可以方便地画出各类函数的图像,这类绘图函数往往以 f 开头,下面我将演示 fplot, fsurf 两个函数。

% fplot画sin函数在[0, 2 * pi]内的曲线

fplot(@sin, [0, 2 * pi]);

% fplot利用x和y上的参数方程画心形线

xfun = @(t)3*(2*cos(t)-cos(2*t));
yfun = @(t)3*(2*sin(t)-sin(2*t));
fplot(xfun, yfun);

% fsurf画二次曲面

fun3 = @(x,y)x.^2+y.^2;
fsurf(fun3, [-2, 2, -2, 2]);

4.句柄操作函数

函数说明
functions(funhandle)返回一个结构体,该结构体存储函数的名称、类型(simple或overload),以及函数M文件的位置
func2str(funhandle)将函数句柄转换为函数名称字符串
str2func(str)将字符串代表的函数转换为函数句柄
save filename.mat funhandle将函数句柄 保存在.mat文件中load filename.mat funhandle 把.mat文件中存储的函数句柄加载到工作区
isa(var, 'function_handle')判断变量var是否是函数句柄
isequal(funhandlea, funhandleb)判断两个函数句柄是否对应于同一个函数

参考链接[1]:https://www.cnblogs.com/heleifz/p/matlab-function-handle.html

参考链接[2]:https://blog.csdn.net/X_s_yu/java/article/details/87008399


长风破浪会有时,直挂云帆济沧海。