MATLAB 匿名函数以及@操作符介绍

前言

本文参考matlab help文档,感兴趣的同学可自行查看。matlab help文档是我目前见过的最全面、最权威、最方便的matlab学习资料~!

具体方法为,命令行窗口输入:

>> doc Anonymous Functions %打开 某项内容的 帮助文档,doc 指令显示的内容比 help xxx详细

matlab版本为R2020b,以下是正文:

什么是匿名函数

匿名函数未存储在程序文件中,而是与函数句柄类型的变量相关联。匿名函数可以接受多个输入并返回一个输出。它们只能包含一条可执行语句。

例如,创建一个求数字平方的匿名函数,并通过sqr句柄指向此匿名函数。

sqr = @(x) x.^2;

变量sqr就是一个函数句柄。@ 操作符创建句柄,@操作符后面的括号()包含函数输入参数。此匿名函数接受单个输入x,并隐式返回单个输出,即与包含平方值的x大小相同的数组。

个人理解,函数句柄类似C语言中的函数指针,@操作符类似于C语言中的取址操作符 &。可以看到上述代码未定义函数名称,只是使用函数句柄变量(类似指针)“指向”了他。通过 whos 指令可以看到sqr类型为 function_handle

>> whos sqr
  Name      Size            Bytes  Class              Attributes

  sqr       1x1                32  function_handle 

可通过下述命令查看关于function_handle的更多介绍。

>> doc  function_handle

匿名函数调用方法跟标准函数一样:

>> a = sqr(5)

a =

    25

许多matlab函数接受函数句柄作为输入,因此可以在一系列值上计算函数。直接看例子:

% integral为积分函数,第一个参数必须为 函数句柄 类型变量
q = integral(sqr,0,1); %通过将函数句柄传递给积分函数,求sqr函数[0,1]区间的积分

使用@操作符,不仅可以为匿名函数创建句柄,同样可以为程序文件中的函数创建句柄。例如:

>> f1 = @sin;
r = integral(f1,0,2*pi) %命令行模式下,通过 Shift+Enter健,可以输入多行指令

r =

  -5.5511e-17

matlab的函数是定义在文件当中的,有些函数功能较为简单,没必要一个函数定义一个文件,此时可使用匿名函数。

你甚至可以不用创建“指向”匿名函数的变量,而是直接使用匿名函数:

q = integral(@(x) x.^2,0,1);

表达式中的变量

函数句柄不仅可以存储表达式,还可以存储表达式求值所需的变量。例如,创建需要系数a、b和c的匿名函数的句柄:

a = 1.3;
b = .2;
c = 30;
parabola = @(x) a*x.^2 + b*x + c;

因为在创建抛物线时a、b和c都可用,所以函数句柄包含这些值。即使清除变量,这些值仍保留在函数句柄中

>> clear a b c
x = 1;
y = parabola(x)

y =

   31.5000

要为系数提供不同的值,必须创建新的函数句柄。

ps:这块没想清楚具体使用场景,既然a,b,c的值不能变,为什么不直接把a,b,c替换成他们的取值?知道的大拿请指教下。

匿名函数嵌套

匿名函数中的表达式可以包含另一个匿名函数。这对于将不同的参数传递给在一系列值上求解的函数非常有用。例如,您可以求解该方程:

g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));

那么,实际怎么编写这种嵌套函数呢?

%将被积函数写为匿名函数
@(x) (x.^2 + c*x + 1)

%通过将函数句柄传递给integral,从0到1对函数求值,
integral(@(x) (x.^2 + c*x + 1),0,1)

%通过为整个方程构造匿名函数来提供c的值,
g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));
%最后一个函数允许您求解任意c值的方程
>> g(2)

ans =

    2.3333

无入参匿名函数

如果函数不需要任何输入,请在定义和调用匿名函数时使用空括号

>> t = @() datestr(now);
d = t()

d =

    '28-Oct-2021 15:52:52'

多输入/多输出匿名函数

匿名函数要求像标准函数一样显式指定输入参数,用逗号分隔多个输入:

myfunction = @(x,y) (x^2 + y^2 + x*y);

x = 1;
y = 10;
z = myfunction(x,y)

但是,匿名函数只返回一个输出。如果函数中的表达式返回多个输出,则可以在调用函数句柄时请求它们。例如,ndgrid函数可以返回与输入向量数量相同的输出。这个调用ndgrid的匿名函数只返回一个输出(mygrid)。调用mygrid访问ndgrid函数返回的输出。

c = 10;
mygrid = @(x,y) ndgrid((-x:x/c:x),(-y:y/c:y));
[x,y] = mygrid(pi,2*pi);

匿名函数数组

虽然大多数MATLAB基本数据类型支持多维数组,但函数句柄必须是标量(单个元素)。但是,可以使用元胞数组或结构数组存储多个函数句柄。最常用的方法是使用元胞数组,例如:

f = {@(x)x.^2;
     @(y)y+10;
     @(x,y)x.^2+y+10};

创建元胞数组时,请记住matlab将空间理解为列分隔符。如上面代码所示,可以省略表达式中的空格,也可以将表达式括在括号中,例如:

f = {@(x) (x.^2);
     @(y) (y + 10);
     @(x,y) (x.^2 + y + 10)};

使用大括号访问单元格的内容。例如,f{1}返回第一个函数句柄。要执行该函数,请在大括号后的括号中传递输入值:

x = 1;
y = 10;

f{1}(x)
f{2}(y)
f{3}(x,y)

全文完!

------------------------------------------------------------------------------------

吐槽下CSDN,内容编辑完提示我“服务超时,请稍后重试”,发布不了。重启电脑,搞的我后半部分内容都丢失了,真lj~!

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值