MATLAB - 匿名函数
MATLAB - 匿名函数
Section titled “MATLAB - 匿名函数”匿名函数是一种简单的一行函数,不存储在单独的 .m 文件中。它们在定义快速计算或将函数作为参数传递给另一个函数(例如用于积分或优化)时非常有用。在其他编程语言中,它们也称为 lambda 函数。
匿名函数剖析
Section titled “匿名函数剖析”语法简洁而强大:
function_handle = @(arg1, arg2, ...) expression;function_handle:存储匿名函数的变量。@:创建匿名函数的符号。(arg1, arg2, ...):输入参数列表。expression:执行并返回的单个 MATLAB 表达式。
示例:单变量函数
Section titled “示例:单变量函数”让我们定义一个计算圆面积的函数。
% 定义匿名函数circleArea = @(radius) pi * radius^2;
% 使用函数area1 = circleArea(5);fprintf('The area of a circle with radius 5 is %.2f\n', area1);示例:多变量函数
Section titled “示例:多变量函数”这是一个计算直角三角形斜边长度的匿名函数。
% 定义匿名函数hypotenuse = @(a, b) sqrt(a^2 + b^2);
% 使用函数hyp = hypotenuse(3, 4);fprintf('The hypotenuse for sides 3 and 4 is %d\n', hyp);示例:无变量函数
Section titled “示例:无变量函数”您可以创建一个返回常量值的函数,这可以用作占位符或简单的生成器。
% 每次调用时返回一个时间戳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 + 5fprintf('The result of the transform is %d\n', result);
% 您甚至可以更改参数并创建一个新函数gain = 100;newTransform = @(x) gain * x + offset;newResult = newTransform(3); % 计算 100 * 3 + 5fprintf('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);