本节说明 MATLAB 中用一行表达式定义函数、无需单独 .m 文件的匿名函数。语法以 @ 引出函数句柄,后接参数列表与表达式。匿名函数便于临时定义计算式,并作为参数传给 fzero、integral 等数值函数,与函数一节中的正式函数文件互为补充。

基本语法

把「对 x 求平方」写成匿名函数时,等号左边是句柄变量,右边是 @(参数) 表达式:

f = @(x) x.^2;

@ 表示函数句柄,(x) 为参数列表,其后为一条表达式。调用方式与普通函数相同:写出句柄名再跟括号与实参。

MATLAB 匿名函数示例运行
f = @(x) x.^2;
disp(f(3))
disp(f([1 2 3]))
power = @(x, n) x.^n;
disp(power(7, 3))

输出:

9
   1   4   9
343

f(3) 把 3 代入 x.^2 得到 9。f([1 2 3]) 之所以能作用于整段向量,是因为表达式里写的是点乘方 .^;若写成矩阵乘方 ^,对行向量往往会因维度规则而报错。

多参数

参数列表中可写多个名字,调用时按位置传入:

power = @(x, n) x.^n;
power(7, 3)      % 343
power(49, 0.5)   % 7
power(10, -10)   % 1e-10

匿名函数的函数体只能是一条表达式,不能像 .m 文件那样写多行 if / for。需要分支或中间变量时,应改写成上一节的函数文件。

传给其他函数

求根、积分等求解器要求第一个参数是「可以调用的函数」,而不是某一次求值得到的标量。因此传入匿名函数(或函数句柄),由求解器在内部反复调用:

% 求 sin(x) - x/2 = 0 在 [1, 3] 上的正根
root = fzero(@(x) sin(x) - x/2, [1 3])

% 求 x^2 在 [0, 1] 上的定积分
area = integral(@(x) x.^2, 0, 1)
root = 1.8955
area = 0.3333

若误写成 fzero(sin(1) - 1/2, [1 3]),传入的是一个已经算完的数,求解器将无法按不同的 x 取样。该方程在 0 处也有根,标量初值在部分环境会收敛到 0,故这里用异号区间。数值求解的更多例子见数值求解。

捕获外部变量

匿名函数可引用定义时所在工作区中的变量。MATLAB 在创建句柄时记下该变量当时的值,后续即使工作区里的同名变量被改写,已经生成的句柄仍使用当初捕获的值:

a = 2;
g = @(x) a * x;
g(10)             % 20
a = 100;
g(10)             % 仍是 20,不是 1000

若希望系数随工作区一起变化,应把该量写成显式参数,例如 g = @(x, a) a * x,调用时再传入当前的 a。

选用对照

场景建议
单行表达式、临时使用匿名函数
逻辑复杂、多行、需长期复用编写独立 .m 函数文件
作为参数传给 fzero / integral / fminbnd 等匿名函数通常更便捷

本节说明了匿名函数的语法、多参数、作为句柄传递及对外部变量的捕获。下一节介绍绘图基础:用 plot 绘制曲线及自变量的生成方式。