前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一起来学matlab-matlab学习笔记13函数 13_2 匿名函数

一起来学matlab-matlab学习笔记13函数 13_2 匿名函数

作者头像
演化计算与人工智能
发布2020-08-14 00:04:08
8730
发布2020-08-14 00:04:08
举报

本文为matlab自学笔记的一部分,之所以学习matlab是因为其真的是人工智能无论是神经网络还是智能计算中日常使用的,非常重要的软件。也许最近其带来的一些负面消息对国内各个高校和业界影响很大。但是我们作为技术人员,更是要奋发努力,拼搏上进,学好技术,才能师夷长技以制夷,为中华之崛起而读书!

本文很多摘录自图书资料,不做任何商业用途,仅做技术分享,侵权删除!请不要放弃自己的理想和道路,加油!!

“参考文献 https://ww2.mathworks.cn/help/matlab/matlab_prog/anonymous-functions.html?searchHighlight=%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B0&s_tid=doc_srchtitle

什么是匿名函数

  • 匿名函数是不存储在程序文件中、但与数据类型是 function_handle 的变量相关的函数。匿名函数可以接受输入并返回输出,就像标准函数一样。但是,它们可能只包含一个可执行语句。
  • 例如,创建用于计算平方数的匿名函数的句柄:
代码语言:javascript
复制
sqr = @(x) x.^2;
  • 变量 sqr 是一个函数句柄。@ 运算符创建句柄,@ 运算符后面的圆括号 () 包括函数的输入参数。该匿名函数接受单个输入 x,并显式返回单个输出,即大小与包含平方值的 x 相同的数组。
  • 通过将特定值 (5) 传递到函数句柄来计算该值的平方,与您将输入参数传递到标准函数一样。
代码语言:javascript
复制
a = sqr(5)
a =
   25
  • 许多 MATLAB® 函数接受将函数句柄用作输入,这样可以在特定值范围内计算函数。可以为匿名函数或程序文件中的函数创建句柄。使用匿名函数的好处是 不必为仅需要简短定义的函数编辑和维护文件。
    • 通过将函数句柄传递到 integral 函数,计算 sqr 函数从 0 到 1 范围内的积分:q = integral(sqr,0,1);
    • 无需在工作区中创建变量以存储匿名函数。可以在表达式内创建临时函数句柄,例如这次对 integral 函数的调用:q = integral(@(x) x.^2,0,1);

表达式中的变量

  • 函数句柄不仅可以存储表达式,还能存储表达式进行计算需要的变量。a = 1.3; b = .2; c = 30; parabola = @(x) a*x.^2 + b*x + c; 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
    • 要为这些系数提供不同值,不需创建新的函数句柄
    • 由于 a、b 和 c 在您创建 parabola 时可用,该函数句柄包含这些值。即使您清除变量,这些值仍持久保留在函数句柄内:
    • 例如,为需要系数 a、b 和 c 的匿名函数创建函数句柄。
  • 可以将函数句柄及其相关值存储在 MAT 文件中,然后使用 save 和 load 函数在后续的 MATLAB 会话中加载它们. save myfile.mat parabola
注意:在构造匿名函数时仅使用显式变量。如果匿名函数访问未在参数列表或主体中显式引用的任何变量或嵌套函数,则 MATLAB 会在您调用该函数时引发错误。隐式变量和函数调用通常会在 eval、evalin、assignin 和 load 等函数中遇到。请避免在匿名函数主体中使用这些函数

多个匿名函数

  • 匿名函数中的表达式可以包含其他匿名函数。这可用于将不同的参数传递到在某一值范围内计算的函数。例如,可以针对不同的c值求解以下方程,方法是合并使用两个匿名函数:
代码语言:javascript
复制
g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));
  1. 将被积函数编写为匿名函数,@(x) (x.^2 + c*x + 1)
  2. 通过将函数句柄传递到 integral 在从 0 到 1 的范围内计算函数,integral(@(x) (x.^2 + c*x + 1),0,1)
  3. 通过为整个方程构造匿名函数以提供 c 的值,g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));
  4. 最终的函数可以针对任何 c 值来求解方程。例如:
代码语言:javascript
复制
g(2)
  ans =
 2.3333

不带输入的函数

  • 如果函数不需要任何输入,在匿名函数定义和调用时输入空的圆括号
代码语言:javascript
复制
t = @() datestr(now);
d = t()
d =
26-Jan-2012 15:11:47
  • 但是不加上括号是一种错误的写法,这会创建另一个函数句柄,并且不执行函数
代码语言:javascript
复制
d = t
d =
    @() datestr(now)

不带输入的函数

  • 匿名函数的多个输入需要显式的指定,用逗号分隔开多个输入。
代码语言:javascript
复制
myfunction = @(x,y) (x^2 + y^2 + x*y);

x = 1;
y = 10;
z = myfunction(x,y)
z = 111
  • 但是不用在创建匿名函数时显式的定义输出参数,如果函数中的表达式返回多个输出,可以在调用该函数时请求它们。将多个输出变量括在方括号中。
代码语言:javascript
复制
c = 10;
mygrid = @(x,y) ndgrid((-x:x/c:x),(-y:y/c:y));
[x,y] = mygrid(pi,2*pi);

匿名函数的数组

  • 虽然大多数的 MATLAB 基本数据类型支持多维数组,但函数句柄必须是标()(单个元素)。但是可以使用 元胞数组或结构体数组 存储多个函数句柄。最常见的方式是使用元胞数组,例如
代码语言:javascript
复制
f = {@(x)x.^2;
     @(y)y+10;
     @(x,y)x.^2+y+10};
  • 创建元胞数组时,记住 MATLAB 将空格解释为列分隔符。如上面的代码所示,省略表达式中的空格,或将表达式括在圆括号中,例如
    • 注意空格和括号
代码语言:javascript
复制
     @(y) (y + 10);
     @(x,y) (x.^2 + y + 10)};
  • 使用花括号访问元胞内容。例如,f{1} 返回第一个函数句柄。要执行该函数,请在花括号之后的圆括号中传递输入值
代码语言:javascript
复制
x = 1;
y = 10;

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

ans =
    20

ans =
    21
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DrawSky 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是匿名函数
  • 表达式中的变量
  • 多个匿名函数
  • 不带输入的函数
  • 不带输入的函数
  • 匿名函数的数组
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档