Первая функция в 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
, но вверх, что это довольно просто.
Создайте defineMyFunctions
m-файл (как в примере с 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Как правило, ответ на ваш вопрос - нет, вы не можете определить более одной видимой снаружи функции на файл. Вы можете вернуть дескрипторы функций локальным функциям, и удобный способ сделать это - сделать их полями структуры. Вот пример:
И вот как это можно использовать:
источник
Единственный способ иметь несколько отдельно доступных функций в одном файле - это определять СТАТИЧЕСКИЕ МЕТОДЫ, используя объектно-ориентированное программирование . Вы бы получили доступ к функции как
myClass.static1()
иmyClass.static2()
т. Д.Функциональность ООП официально поддерживается только начиная с R2008a, поэтому, если вы не хотите использовать старый недокументированный синтаксис ООП, ответ вам будет отрицательным, как объясняет @gnovice .
РЕДАКТИРОВАТЬ
Еще один способ определить несколько функций внутри файла, которые доступны извне, - создать функцию, которая возвращает несколько дескрипторов функций . Другими словами, вы бы назвали свою определяющую функцию как
[fun1,fun2,fun3]=defineMyFunctions
, после чего вы могли бы использоватьout1=fun1(inputs)
и т. Д.источник
Мне очень нравится ответ SCFrench - я хотел бы отметить, что его можно легко изменить, чтобы импортировать функции непосредственно в рабочее пространство, используя функцию assignin. (Выполнение этого напоминает мне много способов Python "import x from y")
И тогда использовали таким образом:
источник
assignin('caller',...)
было бы правильнее. Возможно, вы захотите использовать эти функции из другой функции.В том же духе, что и в ответе SCFrench, но с большим количеством спинов в стиле C #.
Я хотел бы (и часто делаю) сделать класс, содержащий несколько статических методов. Например:
Поскольку методы являются статическими, вам не нужно создавать экземпляр класса. Вы вызываете функции следующим образом:
источник
Я определяю несколько функций в одном файле .m с помощью Octave, а затем использую команду из файла .m, где мне нужно использовать функции из этого файла:
Не уверен, что это доступно с Matlab.
источник
Вы также можете сгруппировать функции в один основной файл вместе с основной функцией, которая выглядит следующим образом:
Тогда вызов subfun1 будет выглядеть так: str = main ('subfun1')
источник
Начиная с R2017b, это официально невозможно. В соответствующей документации указано, что:
Однако обходные пути, предложенные в других ответах, могут привести к чему-то похожему.
источник
Я попробовал с SCFRench и с Ру Хашой на октаву.
И, наконец, это работает: но я сделал некоторые изменения
Может быть вызван в другом файле 'm':
Обновить:
Я добавил ответ, потому что ни +72, ни +20 не работали для меня в октаве. Тот, который я написал, работает отлично (и я проверил это в прошлую пятницу, когда позже написал пост).
источник