exponenta event banner

Анонимные функции

Что такое анонимные функции?

Анонимная функция - это функция, которая не хранится в файле программы, но связана с переменной, типом данных которой является function_handle. Анонимные функции могут принимать несколько входов и возвращать один выход. Они могут содержать только одну исполняемую инструкцию.

Например, создайте дескриптор анонимной функции, которая найдет квадрат числа:

sqr = @(x) x.^2;

Переменная sqr является дескриптором функции. @ оператор создает маркер перемещения и скобки () сразу после @ оператор включает входные аргументы функции. Эта анонимная функция принимает один вход xи неявно возвращает один вывод, массив того же размера, что и x содержит значения в квадрате.

Найти квадрат определенного значения (5), передавая значение дескриптору функции, точно так же, как вы передаете входной аргумент стандартной функции.

a = sqr(5)
a =
   25

Многие функции MATLAB ® принимают дескрипторы функций в качестве входных данных, что позволяет вычислять функции в диапазоне значений. Можно создать дескрипторы для анонимных функций или для функций в файлах программ. Преимущество использования анонимных функций состоит в том, что нет необходимости редактировать и поддерживать файл для функции, требующей только краткого определения.

Например, найдите интеграл sqr функция из 0 кому 1 передав дескриптор функции integral функция:

q = integral(sqr,0,1);

Нет необходимости создавать переменную в рабочей области для хранения анонимной функции. Вместо этого можно создать временный дескриптор функции в выражении, например этот вызов integral функция:

q = integral(@(x) x.^2,0,1);

Переменные в выражении

Дескрипторы функций могут хранить не только выражение, но и переменные, необходимые для вычисления выражения.

Например, создайте дескриптор анонимной функции, требующей коэффициентов a, b, и c.

a = 1.3;
b = .2;
c = 30;
parabola = @(x) a*x.^2 + b*x + c;

Поскольку a, b, и c доступны на момент создания parabola, дескриптор функции включает эти значения. Значения сохраняются в дескрипторе функции, даже если удалить переменные:

clear a b c
x = 1;
y = parabola(x)
y =
   31.5000

Для ввода различных значений коэффициентов необходимо создать новый дескриптор функции:

a = -3.9;
b = 52;
c = 0;
parabola = @(x) a*x.^2 + b*x + c;

x = 1;
y = parabola(1)
y =
   48.1000

Можно сохранить дескрипторы функций и связанные с ними значения в MAT-файле и загрузить их в следующем сеансе MATLAB с помощью save и load функции, такие как

save myfile.mat parabola

При создании анонимных функций используются только явные переменные. Если анонимная функция обращается к любой переменной или вложенной функции, на которую нет явной ссылки в списке аргументов или теле, MATLAB выдает ошибку при вызове функции. Неявные переменные и вызовы функций часто встречаются в таких функциях, как evalevalin, assignin, и load. Избегайте использования этих функций в теле анонимных функций.

Несколько анонимных функций

Выражение в анонимной функции может включать другую анонимную функцию. Это полезно для передачи различных параметров функции, которую вы оцениваете в диапазоне значений. Например, можно решить уравнение

для различных значений c объединяя две анонимные функции:

g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));

Вот как вывести это утверждение:

  1. Запишите интеграл как анонимную функцию,

    @(x) (x.^2 + c*x + 1)
  2. Вычислите функцию от нуля до единицы, передав дескриптор функции integral,

    integral(@(x) (x.^2 + c*x + 1),0,1)
  3. Введите значение для c путем построения анонимной функции для всего уравнения,

    g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));

Конечная функция позволяет решить уравнение для любого значения c. Например:

g(2)
ans =
   2.3333

Функции без входов

Если функция не требует ввода, используйте пустые круглые скобки при определении и вызове анонимной функции. Например:

t = @() datestr(now);
d = t()
d =
26-Jan-2012 15:11:47

Отсутствие скобок в инструкции assignment создает другой дескриптор функции и не выполняет функцию:

d = t
d = 
    @() datestr(now)

Функции с несколькими входами или выходами

Анонимные функции требуют явного указания входных аргументов, как для стандартной функции, разделяя несколько входов запятыми. Например, эта функция принимает два входа, x и y:

myfunction = @(x,y) (x^2 + y^2 + x*y);

x = 1;
y = 10;
z = myfunction(x,y)
z = 111

Однако анонимная функция возвращает только один вывод. Если выражение в функции возвращает несколько выходов, то их можно запросить при вызове дескриптора функции.

Например, ndgrid функция может возвращать столько выходов, сколько входных векторов. Эта анонимная функция, вызывающая ndgrid возвращает только один вывод (mygrid). Призвать mygrid для доступа к выходам, возвращенным ndgrid функция.

c = 10;
mygrid = @(x,y) ndgrid((-x:x/c:x),(-y:y/c:y));
[x,y] = mygrid(pi,2*pi);

Можно использовать выходные данные из mygrid для создания сети или графика поверхности:

z = sin(x) + cos(y);
mesh(x,y,z)

Figure contains an axes. The axes contains an object of type surface.

Массивы анонимных функций

Хотя большинство типов фундаментальных данных MATLAB поддерживают многомерные массивы, дескрипторы функций должны быть скалярами (одиночными элементами). Однако можно сохранить несколько дескрипторов функций с помощью массива ячеек или массива структуры. Наиболее распространенным подходом является использование массива ячеек, например,

f = {@(x)x.^2;
     @(y)y+10;
     @(x,y)x.^2+y+10};

При создании массива ячеек помните, что MATLAB интерпретирует пробелы как разделители столбцов. Опустите пробелы в выражениях, как показано в предыдущем коде, или заключите выражения в круглые скобки, например

f = {@(x) (x.^2);
     @(y) (y + 10);
     @(x,y) (x.^2 + y + 10)};

Доступ к содержимому ячейки с помощью фигурных скобок. Например, f{1} возвращает первый дескриптор функции. Для выполнения функции передайте входные значения в скобках после фигурных скобок:

x = 1;
y = 10;

f{1}(x)
f{2}(y)
f{3}(x,y)
ans =
     1

ans =
    20

ans =
    21

Связанные темы