示例

基本

匿名函数是MATLAB语言的强大工具。它们是本地存在的功能,即:在当前工作空间中。但是,它们不像常规函数那样存在于MATLAB路径中,例如在m文件中。这就是为什么它们被称为匿名的原因,尽管它们在工作空间中可以具有类似变量的名称。

该@运营商

使用@运算符创建匿名函数和函数句柄。例如,创建sin函数(正弦)的句柄并将其用作f:

>> f = @sin

f =

@sin

现在f是该sin函数的句柄。就像(在现实生活中)门把手是使用门的一种方式一样,功能把手是使用功能的一种方式。要使用f,参数将传递给它,就像它是sin函数一样:

>> f(pi/2)

ans =

1

f接受sin函数接受的任何输入参数。如果sin将是一个接受零个输入参数的函数(它不接受,但其他人接受,例如该peaks函数),f()则将在没有输入参数的情况下调用它。

自定义匿名功能

一个变量的匿名函数

像sin上面的示例一样,创建现有函数的句柄显然没有用。在该示例中,这是多余的。但是,创建匿名函数来执行自定义操作很有用,否则这些匿名函数将需要重复多次或为其创建单独的函数。作为一个接受一个变量作为输入的自定义匿名函数的示例,将信号的正弦和余弦平方求和:

>> f = @(x) sin(x)+cos(x).^2

f =

@(x)sin(x)+cos(x).^2

现在f接受一个称为的输入参数x。这是(...)在@运算符后直接使用括号指定的。f现在是一个匿名函数x:f(x)。通过将值传递x给使用f:

>> f(pi)

ans =

1.0000

值的向量或变量也可以传递给f,只要它们在以下范围内以有效方式使用f:

>> f(1:3) % pass a vector to f

ans =

1.1334    1.0825    1.1212

>> n = 5:7;

>> f(n) % pass n to f

ans =

-0.8785    0.6425    1.2254

一个以上变量的匿名函数

以相同的方式,可以创建匿名函数来接受多个变量。接受三个变量的匿名函数的示例:

>> f = @(x,y,z) x.^2 + y.^2 - z.^2

f =

@(x,y,z)x.^2+y.^2-z.^2

>> f(2,3,4)

ans =

-3

参数化匿名函数

工作空间中的变量可以在匿名函数的定义中使用。这称为参数化。例如,要c = 2在匿名函数中使用常量:

>> c = 2;

>> f = @(x) c*x

f =

@(x)c*x

>> f(3)

ans =

6

f(3)使用变量c作为参数与提供的相乘x。请注意,如果此时将的值c设置为其他值,则将f(3)其调用,结果将不会有所不同。的值c是创建匿名函数时的值:

>> c = 2;

>> f = @(x) c*x;

>> f(3)

ans =

6

>> c = 3;

>> f(3)

ans =

6

匿名函数的输入参数未引用工作空间变量

请注意,将工作空间中的变量名称用作匿名函数的输入参数之一(即,使用@(...))将不会使用这些变量的值。相反,它们在匿名函数的范围内被视为不同的变量,即:匿名函数具有其专用工作区,其中输入变量从不引用主工作区中的变量。主工作区和匿名函数的工作区不了解彼此的内容。一个例子来说明这一点:

>> x = 3 % x in main workspace

x =

3

>> f = @(x) x+1; % here x refers to a private x variable

>> f(5)

ans =

6

>> x

x =

3

的值x从主工作空间没有内使用f。此外,在主工作区x中保持不变。在的范围内f,@运算符后括号之间的变量名称独立于主要工作空间变量。

匿名函数存储在变量中

匿名函数(或更准确地说,指向匿名函数的函数句柄)与任何其他值一样存储在当前工作空间中:存储在变量(如上所示),单元格数组({@(x)x.^2,@(x)x+1})或甚至属性(如h.ButtonDownFcn交互式图形)。这意味着匿名函数可以像其他任何值一样对待。将其存储在变量中时,它在当前工作空间中具有名称,可以像保存数字的变量一样进行更改和清除。

换句话说:函数句柄(无论是@sin形式还是匿名函数)只是一个可以存储在变量中的值,就像数值矩阵一样。

进阶使用

将函数句柄传递给其他函数

由于函数句柄被视为变量,因此可以将它们传递给接受函数句柄作为输入参数的函数。

一个示例:在m文件中创建一个接受函数句柄和标量数字的函数。然后,通过传递3给函数句柄来调用它,然后将标量数字添加到结果中。返回结果。

内容funHandleDemo.m:

function y = funHandleDemo(fun,x)

y = fun(3);

y = y + x;

将其保存在路径中的某个位置,例如在MATLAB的当前文件夹中。现在funHandleDemo可以如下使用,例如:

>> f = @(x) x^2; % an anonymous function

>> y = funHandleDemo(f,10) % pass f and a scalar to funHandleDemo

y =

19

另一个现有函数的句柄可以传递给funHandleDemo:

>> y = funHandleDemo(@sin,-5)

y =

-4.8589

请注意,如何@sin快速访问sin函数而无需先使用将该函数存储在变量中f = @sin。

将bsxfun,cellfun和类似的功能与匿名函数一起使用

MATLAB具有一些内置函数,这些函数接受匿名函数作为输入。这是用最少的代码行执行许多计算的方法。例如bsxfun,它执行逐个元素的二进制运算,即:它以逐个元素的方式在两个向量或矩阵上应用函数。通常,这将需要使用for-loop,这通常需要预先分配速度。bsxfun加快使用此过程。下面的示例使用tic和演示了此toc功能,这两个函数可用于计时代码花费的时间。它根据矩阵列的平均值计算每个矩阵元素的差。

A = rand(50); % 50-by-50 matrix of random values between 0 and 1

% method 1: slow and lots of lines of code

tic

meanA = mean(A); % mean of every matrix column: a row vector

% pre-allocate result for speed, remove this for even worse performance

result = zeros(size(A));

for j = 1:size(A,1)

result(j,:) = A(j,:) - meanA;

end

toc

clear result % make sure method 2 creates its own result

% method 2: fast and only one line of code

tic

result = bsxfun(@minus,A,mean(A));

toc

运行上面的示例将产生两个输出:

Elapsed time is 0.015153 seconds.

Elapsed time is 0.007884 seconds.

这些行来自toc函数,这些函数打印自上次调用tic函数以来经过的时间。

该bsxfun调用将第一个输入参数中的函数应用于其他两个输入参数。@minus是与减号相同的操作的长名称。@只要已接受A并mean(A)用作生成有意义结果的输入,就可以指定与其他任何函数不同的匿名函数或句柄()。

特别是对于大型矩阵中的大量数据,bsxfun可以大大加快处理速度。它也使代码看起来更简洁,尽管对于不了解MATLAB或的人来说可能很难解释bsxfun。(请注意,在MATLAB R2016a及更高版本中,许多以前使用的操作bsxfun不再需要它们;它们可以直接运行,在某些情况下甚至可以更快地运行。)A-mean(A)

matlab匿名函数求导,MATLAB匿名函数和函数句柄相关推荐

  1. matlab对多项式求导,matlab中多项式求导

    1 0.5 0 -0.5 -1 -1.5 -2 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 4.对比用多项式函数的 polyder 函数及符号函数中的 diff 函数,求导 x2+2x ...

  2. matlab对多元函数求导,MATLAB多元函数导数求极值或最优值Word版

    <MATLAB多元函数导数求极值或最优值Word版>由会员分享,可在线阅读,更多相关<MATLAB多元函数导数求极值或最优值Word版(9页珍藏版)>请在人人文库网上搜索. 1 ...

  3. matlab匿名函数求导,Matlab中的匿名函数的使用

    转载自:http://blog.sina.com.cn/s/blog_71fb42f70100uyfx.html#commonComment 1.匿名函数的基本用法. handle = @(argli ...

  4. matlab 微分命令 求导,Matlab微分和积分

    第六讲 Matlab 微分和积分 理论介绍:微分.有限差分.积分.离散求和 软件求解:函数及常见注意事项 一.一元函数导数与微分 Matlab 由命令函数diff 来完成求导运算,调用格式为:diff ...

  5. 廖雪峰讲python高阶函数求导公式_高阶函数 - 廖雪峰 Python 2.7 中文教程

    高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下 ...

  6. matlab匿名函数求导,MATLAB中的匿名函数和Python中的匿名函数

    在MATLAB和Python中都有一个叫做匿名函数的东西,在这里对比一下. 一. MATLAB中这样来定义一个匿名函数: f = @(x1, x2, ...) exper @后面的括号里面是自变量,然 ...

  7. matlab用辛普森公式求积分_变限积分函数求导以及高阶导数求法的一些总结

    感谢 @聚创考研 的张帆老师,给我上了一堂生动的课.特此总结一下课上求导数的方法(怕自己忘了). 1.变限积分函数求导 变限积分函数求导简单的分为三类: 第一类(或者形如 这种)可以直接得到 ,第二. ...

  8. matlab求曲线极值程序,matlab函数求极值matlab函数求极值.ppt

    matlab函数求极值matlab函数求极值 * * 函数的极值 1.一元函数的极值 函数命令:fminbnd 调用格式:[x,feval,exitflag,output]=fminbnd(fun,x ...

  9. Matlab三元隐函数求极值,matlab用三重循环求一个三元函数的最大值所对应的x1,x2,x3...

    用MATLAB实现for循环 t=2;whileS(t)>Pstrong&&t 求一个MATLAB循环语句表示这个矩阵200分 这样的,i和j是内部虚数变量,避免轻易使用.cle ...

  10. MATLAB求二阶隐函数导数,如何用matlab对隐函数求导? 值得收藏

    隐函数求导一般都比较繁琐,下面介绍一下 如何用matlab对隐函数求导,这样一来我们就可以解放双手,轻松求解隐函数的导数. 工具/材料 matlab软件 正常运行电脑 操作方法 01 matlab求导 ...

最新文章

  1. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
  2. CSP认证202012-2 期末预测之最佳阈值[C++题解]:遍历、前缀和
  3. 《Windows Communication Foundation之旅》系列之二
  4. CNN发展历史【从LeNet到DenseNet】
  5. PyCharm 中选中一个变量/函数后,所有用到这个变量/函数的地方高亮显示,改配色方案
  6. SAP License:别在走SAP学习的误区
  7. android 导出数据库文件
  8. 微型计算机原理与接口技术第六版课后答案,微型计算机原理与接口技术(第6版)...
  9. luogu P3369(Splay)
  10. Ubuntu18.04安装Pangolin0.6
  11. 『工程项目实践』表格识别 — V2.0
  12. c语言表达ch是大写英文字母,做几道C语言的习题!
  13. 设计模式六大原则之--开闭原则(OCP)
  14. java对接portal协议_Portal协议分析
  15. 游学孔府,乐学礼仪——申子晋
  16. 康奈尔大学计算机硕士要求,康奈尔大学计算机硕士
  17. N皇后问题(java)
  18. 封装建立-SMD封装
  19. Oracle切换到scott用户
  20. c语言标识符能用main吗,请问下C语言用户标识符main到底是不是关键字?关键字包括哪些?...

热门文章

  1. 深度deepin安装腾达U12无线网卡驱动
  2. 图像去噪序列——BM3D图像去噪模型实现
  3. 谈谈编程(2) 软件开发中的方法论
  4. mysql 批量 插入或更新
  5. 向量图svg转jpg、png不清晰问题
  6. linux下桌面编程软件,慧编程桌面端下载|慧编程桌面版 V1.2.0 Linux版 下载_当下软件园_软件下载...
  7. 直播送礼物html,哈你直播如何送礼物 哈你直播给主播送礼物步骤【详解】
  8. 2022深圳杯C题思路解析
  9. FastDFS原理及维护
  10. 内外网隔离 双网隔离DoraOS云终端双桌面云办公应用