Первая функция в m-файле (то есть основная функция ) вызывается при вызове этого m-файла. Не обязательно , чтобы основная функция имела то же имя, что и m-файл, но для ясности она должна . Когда функция и имя файла различаются, имя файла должно использоваться для вызова основной функции.
Все последующие функции в m-файле, называемые локальными функциями (или «подфункциями» в более старой терминологии), могут вызываться только основной функцией и другими локальными функциями в этом m-файле. Функции в других m-файлах не могут вызывать их. Начиная с R2016b, вы также можете добавлять локальные функции в сценарии , хотя поведение области действия остается прежним (то есть их можно вызывать только из сценария).
Кроме того, вы также можете объявить функции в других функциях. Они называются вложенными функциями и могут вызываться только из той функции, в которую они вложены. Они также могут иметь доступ к переменным в функциях, в которые они вложены, что делает их весьма полезными, хотя и немного сложными для работы.
Больше пищи для размышлений ...
Есть несколько способов , вокруг нормального поведения функции обзорного , описанных выше, такие как прохождение функции ручки в качестве выходных аргументов , как указано в ответах от SCFrench и Джонаса (который, начиная с R2013b, облегчаются с помощью localfunctionsфункции). Однако я бы не советовал прибегать к таким уловкам, так как, вероятно, есть гораздо лучшие варианты для организации ваших функций и файлов.
Например, предположим, что у вас есть основная функция Aв м-файле A.m, наряду с локальными функциями D, Eи F. Теперь предположим, что у вас есть два других связанных с ними функций Bи Cв м-файлов B.mи C.m, соответственно, что вы хотите быть в состоянии назвать D, Eи F. Вот несколько вариантов, которые у вас есть:
Положите D, Eи Fкаждый в свои отдельные m-файлы, позволяя любой другой функции вызывать их. Недостатком является то, что сфера применения этих функций велик и не ограничивается только A, Bи C, но вверх, что это довольно просто.
Создайте defineMyFunctionsm-файл (как в примере с Jonas) с помощью D, Eи Fкак локальные функции и как главную функцию, которая просто возвращает им дескрипторы функций. Это позволяет сохранить D, Eи Fв том же файле, но это ничего не делать в отношении объема этих функций , так как любая функция , которая может вызывать defineMyFunctionsих вызова. Затем вам также придется позаботиться о передаче дескрипторов функции в качестве аргументов, чтобы убедиться, что они есть там, где они вам нужны.
Скопируйте D, Eи Fв B.mи C.mкак локальные функции. Это ограничивает область их использования просто A, Bи C, но делает обновление и обслуживание вашего кода кошмаром, потому что у вас есть три копии одного и того же кода в разных местах.
Используйте частные функции ! Если у вас есть A, Bи Cв том же каталоге, вы можете создать подкаталог privateи место D, Eи Fтам, каждый как отдельный м-файл. Это ограничивает сферу их применения , так что они могут быть вызваны только функциями в каталоге непосредственно выше (то есть A, Bи C) и держит их вместе в одном месте (но все же разные м-файлы):
myDirectory/
A.m
B.m
C.m
private/
D.m
E.m
F.m
Все это выходит за рамки вашего вопроса и, вероятно, более детально, чем вам нужно, но я подумал, что было бы неплохо затронуть более общую проблему организации всех ваших m-файлов. ;)
^: @idigas