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

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

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

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

sqr = @(x) x.^2;

Переменные sqr является указателем на функцию. The @ оператор создает указатель и круглые скобки () сразу после @ оператор включает входные аргументы функции. Эта анонимная функция принимает один вход 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 возвращает только один выход (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

Похожие темы