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

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

Анонимная функция является функцией, которая не хранится в программном файле, но сопоставлена с переменной, типом данных которой является 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

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

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, может также возвратить несколько выходных параметров:

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)

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

Несмотря на то, что большинство основополагающих типов данных 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

Похожие темы