Skip to content

MATLAB - 匿名函数

匿名函数是一种简单的一行函数,不存储在单独的 .m 文件中。它们在定义快速计算或将函数作为参数传递给另一个函数(例如用于积分或优化)时非常有用。在其他编程语言中,它们也称为 lambda 函数。

语法简洁而强大:

function_handle = @(arg1, arg2, ...) expression;
  • function_handle:存储匿名函数的变量。
  • @:创建匿名函数的符号。
  • (arg1, arg2, ...):输入参数列表。
  • expression:执行并返回的单个 MATLAB 表达式。

让我们定义一个计算圆面积的函数。

% 定义匿名函数
circleArea = @(radius) pi * radius^2;
% 使用函数
area1 = circleArea(5);
fprintf('The area of a circle with radius 5 is %.2f\n', area1);

这是一个计算直角三角形斜边长度的匿名函数。

% 定义匿名函数
hypotenuse = @(a, b) sqrt(a^2 + b^2);
% 使用函数
hyp = hypotenuse(3, 4);
fprintf('The hypotenuse for sides 3 and 4 is %d\n', hyp);

您可以创建一个返回常量值的函数,这可以用作占位符或简单的生成器。

% 每次调用时返回一个时间戳
getTimestamp = @() datetime('now');
% 使用函数
timestamp1 = getTimestamp();
disp(timestamp1);

主要优点:捕获工作区变量(闭包)

Section titled “主要优点:捕获工作区变量(闭包)”

匿名函数的一个强大特性是它们可以“捕获”或“封闭”定义它们的工作区中的变量。这允许您创建参数化函数,而无需每次都传递参数。

% 定义一个参数
gain = 10;
offset = 5;
% 这个匿名函数捕获了 'gain' 和 'offset'
linearTransform = @(x) gain * x + offset;
% 现在使用这个函数。注意我们只需传递 'x'。
result = linearTransform(3); % 计算 10 * 3 + 5
fprintf('The result of the transform is %d\n', result);
% 您甚至可以更改参数并创建一个新函数
gain = 100;
newTransform = @(x) gain * x + offset;
newResult = newTransform(3); % 计算 100 * 3 + 5
fprintf('The new result is %d\n', newResult);

实际应用:将函数作为参数传递

Section titled “实际应用:将函数作为参数传递”

匿名函数的主要用途是将其传递给期望函数句柄作为输入的其他函数。这在数值方法中很常见。

应用 1:使用 integral 进行数值积分

Section titled “应用 1:使用 integral 进行数值积分”

假设您想计算 sin(x^2) 从 0 到 pi 的积分,而无需为该函数创建单独的 .m 文件。

% 在调用中直接定义要积分的函数
result = integral(@(x) sin(x.^2), 0, pi);
fprintf('The integral of sin(x^2) from 0 to pi is %.4f\n', result);

应用 2:使用 fminsearch 寻找函数最小值

Section titled “应用 2:使用 fminsearch 寻找函数最小值”

让我们找到 Rosenbrock 函数的最小值,这是一个经典的优化测试用例。

% Rosenbrock 的“香蕉”函数
banana = @(x) (1-x(1))^2 + 100*(x(2)-x(1)^2)^2;
% 寻找最小值,从点 [-1, 2] 开始
startPoint = [-1, 2];
[min_coords, min_value] = fminsearch(banana, startPoint);
fprintf('Minimum found at (%.2f, %.2f) with value %.4e\n', min_coords(1), min_coords(2), min_value);

应用 3:使用 arrayfun 进行元素级操作

Section titled “应用 3:使用 arrayfun 进行元素级操作”

将一个简单的操作应用于数组的每个元素。

% 定义一个数字数组
numbers = [1, 2, 3, 4, 5];
% 使用匿名函数将条件应用于每个元素
% 返回一个逻辑数组 (1 表示 true, 0 表示 false)
is_even = arrayfun(@(n) mod(n, 2) == 0, numbers);
disp('Original numbers:');
disp(numbers);
disp('Is the number even?');
disp(is_even);