Matlab中的匿名函数

目录

匿名函数

什么是匿名函数?

表达式中的变量

多个匿名函数

不带输入的函数

带有多个输入或输出的函数

匿名函数的数组


匿名函数

什么是匿名函数?

​        匿名函数是不存储在程序文件中、但与数据类型是function_handle的变量相关的函数。匿名函数可以接受多个输入并返回一个输出。它们可能只包含一个可执行语句。

        例如,创建用于计算平方数的匿名函数的句柄:

sqr = @(x) x.^2;

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

        通过将特定值 (5) 传递到函数句柄来计算该值的平方,与输入参数传递到标准函数一样。

a = sqr(5)

a =
   25

        许多 MATLAB® 函数接受将函数句柄用作输入,这样可以在特定值范围内计算函数。可以为匿名函数或程序文件中的函数创建句柄。使用匿名函数的好处是不必为仅需要简短定义的函数编辑和维护文件。

        例如,通过将函数句柄传递到 integral 函数,计算 sqr 函数从 0 到 1 范围内的积分:

q = integral(sqr,0,1);

        无需在工作区中创建变量以存储匿名函数。可以在表达式内创建临时函数句柄,例如这次对 integral 函数的调用:

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 在创建 parabola 时可用,该函数句柄包含这些值。即使清除变量,这些值仍持久保留在函数句柄内:

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

y =
   31.5000

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

a = -3.9;
b = 52;
c = 0;
parabola = @(x) a*x.^2 + b*x + c;

x = 1;
y = parabola(1)

y =
   48.1000

        可以将函数句柄及其相关值存储在 MAT 文件中,然后使用 save 和 load 函数在后续的 MATLAB 会话中加载它们,例如

save myfile.mat parabola

        在构造匿名函数时仅使用显式变量。如果匿名函数访问未在参数列表或主体中显式引用的任何变量或嵌套函数,则 MATLAB 会在您调用该函数时引发错误。隐式变量和函数调用通常会在 eval、evalin、assignin 和 load 等函数中遇到。请避免在匿名函数主体中使用这些函数。

多个匿名函数

        匿名函数中的表达式可以包含其他匿名函数。这可用于将不同的参数传递到在某一值范围内计算的函数。例如,可以针对不同的

        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 =
26-Jan-2012 15:11:47

        在赋值语句中省略圆括号会创建另一函数句柄,并且不执行函数:

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

带有多个输入或输出的函数

        匿名函数需要像对标准函数一样显式指定输入参数,用逗号隔开多个输入。例如,以下函数接受两个输入 x 和 y:

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

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


z = 111

        然而,匿名函数只返回一个输出。如果函数中的表达式返回多个输出,可以在调用该函数句柄时请求它们。

        例如,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);

        可以使用来自 mygrid 的输出创建网格图或曲面图:

z = sin(x) + cos(y);
mesh(x,y,z)

匿名函数的数组

        虽然大多数的 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)


ans =
     1

ans =
    20

ans =
    21

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值