匿名函数
什么是匿名函数?
匿名函数是这样的函数不存储在程序文件中,但与数据类型为的变量相关联
.匿名函数可以接受多个输入并返回一个输出。它们只能包含一个可执行语句。function_handle
例如,创建一个匿名函数的句柄,用于查找一个数的平方:
SQR = @(x) x.^2;
变量sqr
是函数句柄。的@
运算符创建句柄和括号()
紧接着@
运算符包含函数输入参数。这个匿名函数接受单个输入x
,并隐式返回单个输出,即与x
它包含了平方值。
求特定值的平方(5
)通过将值传递给函数句柄,就像将输入参数传递给标准函数一样。
A = sqr(5)
A = 25
许多MATLAB®函数接受函数句柄作为输入,因此可以在一定范围内计算函数的值。可以为匿名函数或程序文件中的函数创建句柄。使用匿名函数的好处是,您不必为只需要简短定义的函数编辑和维护文件。
例如,求积分sqr
函数0
来1
通过将函数句柄传递给积分
功能:
Q = integral(sqr,0,1);
您不需要在工作区中创建变量来存储匿名函数。相反,可以在表达式中创建临时函数句柄,例如对积分
功能:
Q =积分(@(x) x.^2,0,1);
表达式中的变量
函数句柄不仅可以存储表达式,还可以存储表达式求值所需的变量。
例如,为需要系数的匿名函数创建句柄一个
,b
,c
.
A = 1.3;B = .2;C = 30;抛物线= @(x) a*x。^2 + b*x + c;
因为一个
,b
,c
在创建时可用吗抛物线
,函数句柄包含这些值。即使你清除了变量,值也会在函数句柄中保留:
清晰的一个bcX = 1;Y =抛物线(x)
Y = 31.5000
为了提供不同的系数值,你必须创建一个新的函数句柄:
A = -3.9;B = 52;C = 0;抛物线= @(x) a*x。^2 + b*x + c;X = 1;Y =抛物线(1)
Y = 48.1000
方法将函数句柄及其相关值保存在mat文件中,并在后续的MATLAB会话中加载它们保存
而且负载
函数,例如
保存myfile.mat抛物线
构造匿名函数时只使用显式变量。如果匿名函数访问参数列表或函数体中未显式引用的任何变量或嵌套函数,则MATLAB在调用该函数时抛出错误。隐式变量和函数调用经常在函数中遇到,例如eval
,evalin
,assignin
,负载
.避免在匿名函数体中使用这些函数。
多个匿名函数
匿名函数中的表达式可以包含另一个匿名函数。这对于将不同的参数传递给要在一定范围内求值的函数非常有用。例如,你可以解这个方程
对于不同的值c
通过组合两个匿名函数:
G = @(c)(积分(@(x) (x.^2 + 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.^2 + c*x + 1),0,1));
最后一个函数允许你解任意值的方程c
.例如:
g (2)
Ans = 2.3333
无输入函数
如果函数不需要任何输入,则在定义和调用匿名函数时使用空括号。例如:
T = @() datestr(现在);D = t()
d = 26-Jan-2012 15:11:47
在赋值语句中省略括号会创建另一个函数句柄,并且不会执行函数:
D = t
D = @() datestr(现在)
具有多输入或多输出的函数
匿名函数要求您像标准函数一样显式地指定输入参数,用逗号分隔多个输入。例如,这个函数接受两个输入,x
而且y
:
Myfunction = @(x,y) (x²+ y²+ 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 = sinx + cos y;网格(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;F {1}(x) F {2}(y) F {3}(x,y)
Ans = 1 Ans = 20 Ans = 21