Вложенная функция - это функция, которая полностью содержится в родительской функции. Любая функция в файле программы может включать вложенную функцию.
Например, эта функция с именем parent содержит вложенную функцию с именем nestedfx:
function parent disp('This is the parent function') nestedfx function nestedfx disp('This is the nested function') end end
Основное различие между вложенными функциями и другими типами функций заключается в том, что они могут обращаться к переменным, определенным в родительских функциях, и изменять их. В результате:
Вложенные функции могут использовать переменные, которые явно не передаются в качестве входных аргументов.
В родительской функции можно создать дескриптор вложенной функции, содержащий данные, необходимые для запуска вложенной функции.
Как правило, функции не требуют end заявление. Однако, чтобы вложить любую функцию в файл программы, все функции в этом файле должны использовать end заявление.
Нельзя определить вложенную функцию в любой из управляющих инструкций программы MATLAB ®, например if/elseif/else, switch/case, for, while, или try/catch.
Необходимо вызвать вложенную функцию либо непосредственно по имени (без использования feval) или с помощью дескриптора функции, созданного с помощью @ оператор (и не str2func).
Все переменные во вложенных функциях или функции, которые их содержат, должны быть явно определены. Таким образом, нельзя вызвать функцию или сценарий, присваивающий значения переменным, если только эти переменные не существуют в рабочей области функции. (Дополнительные сведения см. в разделе Устранение ошибки: попытка добавления переменной в статическую рабочую область.)
Как правило, переменные в одной рабочей области функции недоступны для других функций. Однако вложенные функции могут обращаться к переменным и изменять их в рабочих областях функций, которые их содержат.
Это означает, что вложенная функция и содержащая ее функция могут изменять одну и ту же переменную без передачи этой переменной в качестве аргумента. Например, в каждой из этих функций, main1 и main2, и основная функция, и вложенная функция могут обращаться к переменной x:
function main1 x = 5; nestfun1 function nestfun1 x = x + 1; end end |
function main2 nestfun2 function nestfun2 x = 5; end x = x + 1; end |
Если родительские функции не используют заданную переменную, переменная остается локальной для вложенной функции. Например, в этой функции с именем main, две вложенные функции имеют свои собственные версии x которые не могут взаимодействовать друг с другом:
function main nestedfun1 nestedfun2 function nestedfun1 x = 1; end function nestedfun2 x = 2; end end
Функции, возвращающие выходные аргументы, имеют переменные для выходных данных в рабочей области. Однако родительские функции имеют переменные для вывода вложенных функций только в том случае, если они явно запрашивают их. Например, эта функция parentfun не имеет переменной y в рабочей области:
function parentfun x = 5; nestfun; function y = nestfun y = x + 1; end end
Если изменить код следующим образом, переменная z находится в рабочем пространстве parentfun:
function parentfun x = 5; z = nestfun; function y = nestfun y = x + 1; end end
Вложенные функции могут использовать переменные из трех источников:
Входные аргументы
Переменные, определенные в вложенной функции
Переменные, определенные в родительской функции, также называемые переменными внешней области
При создании дескриптора функции для вложенной функции этот дескриптор сохраняет не только имя функции, но и значения переменных внешней области.
Например, создайте функцию в файле с именем makeParabola.m. Эта функция принимает несколько полиномиальных коэффициентов и возвращает дескриптор вложенной функции, которая вычисляет значение этого полинома.
function p = makeParabola(a,b,c) p = @parabola; function y = parabola(x) y = a*x.^2 + b*x + c; end end
makeParabola функция возвращает дескриптор parabola функция, включающая значения коэффициентов a, b, и c.
В командной строке вызовите makeParabola функция со значениями коэффициентов 1.3, .2, и 30. Использовать дескриптор возвращенной функции p для вычисления полинома в определенной точке:
p = makeParabola(1.3,.2,30); X = 25; Y = p(X)
Y = 847.5000
Многие функции MATLAB принимают входы дескрипторов функций для оценки функций в диапазоне значений. Например, постройте график параболического уравнения из -25 кому +25:
fplot(p,[-25,25])

Можно создать несколько дескрипторов для parabola функция, каждая из которых использует различные полиномиальные коэффициенты:
firstp = makeParabola(0.8,1.6,32); secondp = makeParabola(3,4,50); range = [-25,25]; figure hold on fplot(firstp,range) fplot(secondp,range,'r:') hold off

Каждая функция имеет определенную область действия, то есть набор других функций, для которых она видна. Доступна вложенная функция:
С уровня непосредственно над ним. (В следующем коде функция A может позвонить B или D, но не C или E.)
Из функции, вложенной на том же уровне в одну родительскую функцию. (Функция B может позвонить D, и D может позвонить B.)
Из функции на любом более низком уровне. (Функция C может позвонить B или D, но не E.)
function A(x, y) % Main function B(x,y) D(y) function B(x,y) % Nested in A C(x) D(y) function C(x) % Nested in B D(x) end end function D(x) % Nested in A E(x) function E(x) % Nested in D disp(x) end end end
Самый простой способ расширить область действия вложенной функции - создать дескриптор функции и вернуть его в качестве выходного аргумента, как показано в разделе Использование дескрипторов для хранения параметров функции. Дескриптор может быть создан только для функций, которые могут вызывать вложенную функцию.