匿名函数是指不存储在程序文件中,但与数据类型为的变量相关联function_handle
.匿名函数可以接受输入并返回输出,就像标准函数一样。但是,它们只能包含单个可执行语句。
例如,创建一个匿名函数的句柄来查找一个数字的平方:
@(x) x.^2;
变量sqr
是函数句柄。的@
操作符创建句柄和括号()
后立即@
操作符包含函数的输入参数。这个匿名函数接受单个输入x
,并隐式返回单个输出,一个大小相同的数组x
它包含了平方值。
求特定值的平方(5
)通过将值传递给函数句柄,就像将输入参数传递给标准函数一样。
一个= sqr (5)
= 25
许多MATLAB®函数接受函数句柄作为输入,这样就可以在一定范围内对函数求值。您可以为匿名函数或程序文件中的函数创建句柄。使用匿名函数的好处是,您不必为只需要简短定义的函数编辑和维护文件。
例如,求积分sqr
函数0
来1
将函数句柄传递给积分
功能:
q =积分(sqr 0 1);
您不需要在工作区中创建变量来存储匿名函数。相反,您可以在表达式中创建一个临时函数句柄,例如对积分
功能:
Q =积分(@(x) x.^2,0,1);
函数句柄不仅可以存储表达式,还可以存储表达式求值所需的变量。
例如,为需要系数的匿名函数创建一个函数句柄一个
,b
,c
.
一个= 1.3;b = 2;c = 30;抛物线= @(x) a*x。^2 + b*x + c;
因为一个
,b
,c
在创建时可用吗抛物线
,则函数句柄包含这些值。即使你清除了变量,这些值也会保存在函数句柄中:
清晰的一个bcx = 1;y =抛物线(x)
y = 31.5000
要为系数提供不同的值,必须创建一个新的函数句柄:
一个= -3.9;b = 52个;c = 0;抛物线= @(x) a*x。^2 + b*x + c;x = 1;y =抛物线(1)
y = 48.1000
可以将函数句柄及其关联值保存在mat文件中,并使用保存
和负载
功能,比如
保存myfile.mat抛物线
在构造匿名函数时,仅使用显式变量。如果匿名函数访问在参数列表或函数体中没有显式引用的任何变量或嵌套函数,MATLAB在调用该函数时抛出一个错误。隐式变量和函数调用经常在函数中遇到,例如eval
,evalin
,assignin
,负载
.避免在匿名函数体中使用这些函数。
匿名函数中的表达式可以包含另一个匿名函数。这对于将不同的参数传递给正在对一段值进行求值的函数非常有用。例如,你可以解这个方程
的变化值c
通过组合两个匿名函数:
G = @(c)(积分(@(x) (x.²+ c*x + 1),0,1))
下面是如何推导这种说法:
将被积函数写成匿名函数,
@(x) (x.^2 + c*x + 1)
将函数句柄传递给,求函数从0到1的值积分
,
积分(@(x) (x.^2 + c*x + 1),0,1)
提供值c
通过构造整个方程的匿名函数,
G = @(c)(积分(@(x) (x.²+ 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
也可以返回多个输出:
c = 10;Mygrid = @(x,y) ndgrid((-x:x/c:x),(-y:y/c:y));(x, y) = mygrid(π,2 *π);
可以使用的输出mygrid
创建网格或平面图:
Z = sinx + cosy;网格(x, y, z)
尽管大多数MATLAB基本数据类型支持多维数组,但函数句柄必须是标量(单个元素)。万博1manbetx但是,您可以使用单元格数组或结构数组存储多个函数句柄。最常用的方法是使用单元格数组,例如
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;{1} f f (x) {2} {3} (y) f (x, y)
Ans = 1 Ans = 20 Ans = 21