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

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

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

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

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

Например, создайте указатель на анонимную функцию, которая требует коэффициентов aB, и c.

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

Поскольку aB, и 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 возвращает только один выходной параметр (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 object. The axes object 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

Похожие темы