匿名函数 #
一、匿名函数概述 #
匿名函数是不需要创建单独文件的简短函数,使用 @ 符号定义:
matlab
% 语法
func = @(参数列表) 表达式
% 示例
square = @(x) x^2;
square(5) % 25
二、基本用法 #
2.1 单参数 #
matlab
% 平方函数
square = @(x) x^2;
square(3) % 9
% 绝对值
abs_val = @(x) abs(x);
abs_val(-5) % 5
% 三角函数
my_sin = @(x) sin(x);
my_sin(pi/2) % 1
2.2 多参数 #
matlab
% 加法
add = @(a, b) a + b;
add(3, 5) % 8
% 乘法
multiply = @(a, b) a * b;
multiply(4, 5) % 20
% 计算距离
distance = @(x1, y1, x2, y2) sqrt((x2-x1)^2 + (y2-y1)^2);
distance(0, 0, 3, 4) % 5
2.3 无参数 #
matlab
% 获取当前时间
get_time = @() datestr(now);
get_time() % '27-Mar-2026 10:30:45'
% 获取随机数
random_num = @() rand();
random_num() % 0.8147
三、捕获变量 #
3.1 捕获外部变量 #
matlab
% 匿名函数捕获定义时的变量值
a = 10;
f = @(x) x + a;
f(5) % 15
% 修改a不影响函数
a = 20;
f(5) % 仍然是15(捕获的是定义时的值)
3.2 使用当前值 #
matlab
% 使用函数句柄获取当前值
a = 10;
f = @(x) x + a;
f(5) % 15
% 如果需要使用当前值,需要重新定义
a = 20;
f = @(x) x + a;
f(5) % 25
四、函数数组 #
4.1 创建函数数组 #
matlab
% 函数数组
funcs = {@(x) x, @sin, @cos, @tan};
% 使用
for i = 1:length(funcs)
fprintf('%.4f\n', funcs{i}(pi/4));
end
% 0.7854
% 0.7071
% 0.7071
% 1.0000
4.2 条件选择函数 #
matlab
% 根据条件选择不同函数
operations = {@(x,y) x+y, @(x,y) x-y, @(x,y) x*y, @(x,y) x/y};
names = {'加', '减', '乘', '除'};
choice = 3; % 选择乘法
result = operations{choice}(10, 5);
fprintf('%s: %d\n', names{choice}, result);
% 乘: 50
五、与高阶函数配合 #
5.1 arrayfun #
matlab
% 对数组每个元素应用函数
data = [1 2 3 4 5];
squares = arrayfun(@(x) x^2, data);
% [1 4 9 16 25]
% 使用匿名函数
result = arrayfun(@(x) sin(x) + cos(x), data);
5.2 cellfun #
matlab
% 对元胞数组应用函数
names = {'apple', 'banana', 'cherry'};
lengths = cellfun(@length, names);
% [5 6 6]
% 使用匿名函数
upper_names = cellfun(@(s) upper(s), names, 'UniformOutput', false);
% {'APPLE', 'BANANA', 'CHERRY'}
5.3 structfun #
matlab
% 对结构体字段应用函数
s.a = 10;
s.b = 20;
s.c = 30;
doubled = structfun(@(x) x*2, s);
% [20; 40; 60]
六、实用示例 #
6.1 数值积分 #
matlab
% 定义被积函数
f = @(x) sin(x) + x.^2;
% 数值积分
result = integral(f, 0, pi);
fprintf('积分结果: %.4f\n', result);
6.2 方程求解 #
matlab
% 定义方程
f = @(x) x^3 - 2*x - 5;
% 求根
x0 = 2; % 初始猜测
root = fzero(f, x0);
fprintf('方程的根: %.4f\n', root); % 2.0946
6.3 优化问题 #
matlab
% 定义目标函数
f = @(x) (x-3)^2 + 1;
% 最小化
[x_min, f_min] = fminbnd(f, 0, 10);
fprintf('最小值点: %.4f, 最小值: %.4f\n', x_min, f_min);
% 最小值点: 3.0000, 最小值: 1.0000
6.4 曲线拟合评估 #
matlab
% 数据
x = 0:0.1:10;
y = 2*x + 1 + 0.5*randn(size(x));
% 定义误差函数
error_func = @(params) sum((y - (params(1)*x + params(2))).^2);
% 优化参数
initial_params = [1, 0];
optimal_params = fminsearch(error_func, initial_params);
fprintf('拟合参数: a=%.4f, b=%.4f\n', optimal_params(1), optimal_params(2));
6.5 参数化函数 #
matlab
% 创建参数化函数
function f = make_linear(a, b)
f = @(x) a*x + b;
end
% 使用
f1 = make_linear(2, 3);
f2 = make_linear(1, 0);
f1(5) % 13
f2(5) % 5
七、匿名函数 vs 普通函数 #
7.1 对比 #
| 特性 | 匿名函数 | 普通函数 |
|---|---|---|
| 定义位置 | 命令窗口/脚本 | 单独文件 |
| 复杂度 | 单行表达式 | 任意复杂 |
| 参数验证 | 无 | 可验证 |
| 文档 | 无 | 可有帮助文档 |
| 调试 | 困难 | 方便 |
7.2 选择建议 #
matlab
% 简单计算:使用匿名函数
square = @(x) x^2;
% 复杂逻辑:使用普通函数
% 保存为 process_data.m
function result = process_data(data, options)
% 参数验证
if isempty(data)
error('数据为空');
end
% 复杂处理
% ...
end
八、嵌套匿名函数 #
8.1 基本嵌套 #
matlab
% 嵌套匿名函数
f = @(x) @(y) x + y;
g = f(10); % g = @(y) 10 + y
g(5) % 15
8.2 柯里化 #
matlab
% 柯里化:将多参数函数转为单参数函数链
add = @(a) @(b) a + b;
add5 = add(5);
add5(3) % 8
% 三参数柯里化
add3 = @(a) @(b) @(c) a + b + c;
add3(1)(2)(3) % 6
九、最佳实践 #
9.1 保持简洁 #
matlab
% 推荐:简洁的单行表达式
square = @(x) x^2;
% 不推荐:复杂的表达式
% complex_func = @(x) ...很长的表达式...
9.2 命名清晰 #
matlab
% 推荐:有意义的名称
distance = @(p1, p2) sqrt(sum((p2-p1).^2));
is_positive = @(x) x > 0;
% 不推荐:无意义的名称
f = @(x) x > 0;
9.3 复杂逻辑用普通函数 #
matlab
% 匿名函数不适合复杂逻辑
% 不推荐
process = @(data) ...复杂的处理逻辑...;
% 推荐:使用普通函数
function result = process(data)
% 清晰的处理步骤
step1 = preprocess(data);
step2 = transform(step1);
result = finalize(step2);
end
十、总结 #
本章学习了:
- 匿名函数定义:
@(参数) 表达式 - 基本用法:单参数、多参数、无参数
- 变量捕获:捕获定义时的值
- 函数数组:存储多个函数
- 高阶函数:arrayfun、cellfun、structfun
- 实用场景:数值积分、方程求解、优化
- 最佳实践:保持简洁、命名清晰
下一章将学习函数句柄。
最后更新:2026-03-27