如果你学过其他的编程语言的话,类比可能会让你更好地理解什么是function handle(“函数句柄”,这个翻译太难听了)。Matlab里面function handle类似于python里面的函数对象、C++语言里面的函数指针、Perl里面的函数引用。function handle可以将function包装操作成(handle)一个变量。一个函数变成了一个变量之后,则我们可以在另外一个函数的参数input里面,将这个function handle直接当成参数来输入。我们首先来看一看几种定义function handle的方式:
% 方式1:直接在系统函数名字前面加上符号@
fun1 = @sin;
fun2 = @abs;
fun3 = @svd;
% 方式2 : 利用str2func函数,将系统函数名字用单引号括起来
fun4 = str2func('cos');
fun5 = str2func('tan');
% 方式3 : 使用类似于R里面的lambda函数的定义方式,这个方法十分灵活,
% 首先用()将参数列表写出来,然后再写函数表达式,具体如下
fun6 = @(x, y)x.^2 + y.^2;
fun7 = @(x, y, z)exp(x + y + z);
2.我们来看看function handle能带来什么好处:
比如说,我们想对一个数据集MyData进行排序. 数据集MyData里面只有一个变量x,但是我们希望按照以下三个方式对x进行排序. 第一,按照x的绝对值大小;第二,按照sin(x)的值的大小;第三,按照cos(x)的值的大小。如果我们用python来编程的话,我们可能需要写三个不同的函数;或者是写一个函数,然后在这个函数里面添加if判断语句. 但是用matlab来写的话,就比较简洁.
首先,我们定义一个排序函数,将其储存在一个名为mysort.m的脚本中
function sorted = mysort(mydata, myfunction)
transformed = myfunction(mydata);% 对原始数组进行变换
[~, index] = sort(transformed); % 获得排序后的原数组位置索引
sorted = mydata(index); % 返回排序后的原数组
end
其次,我们再使用如下的脚本来调用函数:
%生成一个测试数据
>>MyData = round(randn(8, 1) * 10)
MyData =
7
-3
3
-8
9
-11
-11
-8
%方式1,按照绝对值大小来排序
>>mysort(MyData, @abs)
ans =
-3
3
7
-8
-8
9
-11
-11
%方式2,按照sin(x)大小来排序% 将arr按照其绝对值大小排序
>>mysort(MyData, @sin)
ans =
-8
-8
-3
3
9
7
-11
-11
%方式3,按照cos(x)大小来排序
>>mysort(MyData, @cos)
ans =
-3
3
9
-8
-8
-11
-11
7
欢迎各位大佬补充和指正