Анонимная функция является функцией, которая не хранится в программном файле, но сопоставлена с переменной, типом данных которой является 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 выдает ошибку, когда вы вызываете функцию. С неявными переменными и вызовами функции часто сталкиваются в функциях, таких как eval
, evalin
, assignin
и load
. Избегайте использования этих функций в теле анонимных функций.
Выражение в анонимной функции может включать другую анонимную функцию. Это полезно для передачи различных параметров к функции, которую вы выполняете в области значений значений. Например, можно решить уравнение
для переменных значений c
путем объединения двух анонимных функций:
g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));
Вот то, как вывести этот оператор:
Запишите подынтегральное выражение как анонимную функцию,
@(x) (x.^2 + c*x + 1)
Выполните функцию от нуля до одного путем передачи указателя на функцию integral
,
integral(@(x) (x.^2 + c*x + 1),0,1)
Предоставьте значение для 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