匿名函数 #

一、匿名函数概述 #

匿名函数是不需要创建单独文件的简短函数,使用 @ 符号定义:

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

十、总结 #

本章学习了:

  1. 匿名函数定义@(参数) 表达式
  2. 基本用法:单参数、多参数、无参数
  3. 变量捕获:捕获定义时的值
  4. 函数数组:存储多个函数
  5. 高阶函数:arrayfun、cellfun、structfun
  6. 实用场景:数值积分、方程求解、优化
  7. 最佳实践:保持简洁、命名清晰

下一章将学习函数句柄。

最后更新:2026-03-27