本节说明 MATLAB 中用一行表达式定义函数、无需单独 .m 文件的匿名函数。语法以 @ 引出函数句柄,后接参数列表与表达式。匿名函数便于临时定义计算式,并作为参数传给 fzero、integral 等数值函数,与函数一节中的正式函数文件互为补充。
基本语法
把「对 x 求平方」写成匿名函数时,等号左边是句柄变量,右边是 @(参数) 表达式:
f = @(x) x.^2;@ 表示函数句柄,(x) 为参数列表,其后为一条表达式。调用方式与普通函数相同:写出句柄名再跟括号与实参。
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
343f(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 绘制曲线及自变量的生成方式。