La primera función en un archivo m (es decir, la función principal ) se invoca cuando se llama a ese archivo m. No es necesario que la función principal tenga el mismo nombre que el archivo m, pero para mayor claridad debería serlo . Cuando la función y el nombre del archivo difieren, el nombre del archivo debe usarse para llamar a la función principal.
Todas las funciones posteriores en el archivo m, llamadas funciones locales (o "subfunciones" en la terminología anterior), solo pueden ser llamadas por la función principal y otras funciones locales en ese archivo m. Las funciones en otros archivos m no pueden llamarlos. A partir de R2016b, también puede agregar funciones locales a los scripts , aunque el comportamiento del alcance sigue siendo el mismo (es decir, solo se pueden invocar desde el script).
Además, también puede declarar funciones dentro de otras funciones. Estas se llaman funciones anidadas , y solo se pueden llamar desde la función en la que están anidadas. También pueden tener acceso a variables en funciones en las que están anidadas, lo que los hace bastante útiles, aunque un poco difíciles de trabajar.
Más comida para pensar ...
Hay algunas formas de evitar el comportamiento de alcance de la función normal descrito anteriormente, como pasar identificadores de función como argumentos de salida como se menciona en las respuestas de SCFrench y Jonas (que, a partir de R2013b, es facilitado por la localfunctions
función). Sin embargo, no sugeriría que sea un hábito recurrir a tales trucos, ya que probablemente haya opciones mucho mejores para organizar sus funciones y archivos.
Por ejemplo, digamos que usted tiene una función principal A
en un archivo-m A.m
, junto con las funciones locales D
, E
y F
. Ahora digamos que usted tiene otras dos funciones relacionadas B
y C
en la M-archivos B.m
y C.m
, respectivamente, que también quiere ser capaz de llamar D
, E
y F
. Aquí hay algunas opciones que tiene:
Poner D
, E
y F
cada uno en sus propios archivos m separados, permitiendo que cualquier otra función los llame. La desventaja es que el alcance de estas funciones es grande y no se limita sólo A
, B
y C
, pero la ventaja es que esto es bastante simple.
Crear un defineMyFunctions
archivo-m (como en Jonas ejemplo) con D
, E
y F
como funciones locales y una función principal que simplemente devuelve las manijas a ellos. Esto le permite mantener D
, E
y F
en el mismo archivo, pero no hace nada con respecto al alcance de estas funciones ya que cualquier función que pueda llamar defineMyFunctions
puede invocarlas. También debe preocuparse por pasar los identificadores de función como argumentos para asegurarse de tenerlos donde los necesita.
Copiar D
, E
y F
en B.m
y C.m
como funciones locales. Esto limita el alcance de su uso a solo A
, B
y C
, pero hace que la actualización y el mantenimiento de su código sean una pesadilla porque tiene tres copias del mismo código en diferentes lugares.
¡Usa funciones privadas ! Si usted tiene A
, B
y C
en el mismo directorio, puede crear un subdirectorio llamado private
y lugar D
, E
y F
de allí, cada uno como un archivo-m separada. Esto limita su ámbito de aplicación por lo que sólo pueden ser llamados por funciones en el directorio inmediatamente superior (es decir A
, B
y C
) y los mantiene juntos en el mismo lugar (pero aún diferentes archivos-m):
myDirectory/
A.m
B.m
C.m
private/
D.m
E.m
F.m
Todo esto va un poco más allá del alcance de su pregunta, y probablemente sea más detallado de lo que necesita, pero pensé que sería bueno abordar la preocupación más general de organizar todos sus archivos m. ;)
^
, @idigasEn general, la respuesta a su pregunta es no, no puede definir más de una función externamente visible por archivo. Sin embargo, puede devolver los identificadores de función a funciones locales, y una forma conveniente de hacerlo es convertirlos en campos de una estructura. Aquí hay un ejemplo:
Y así es como podría usarse:
fuente
La única forma de tener múltiples funciones accesibles por separado en un solo archivo es definir MÉTODOS ESTÁTICOS utilizando programación orientada a objetos . Accedería a la función como
myClass.static1()
,myClass.static2()
etc.La funcionalidad OOP solo se admite oficialmente desde R2008a, por lo que, a menos que desee utilizar la sintaxis OOP antigua e indocumentada, la respuesta para usted es no, como explica @gnovice .
EDITAR
Una forma más de definir múltiples funciones dentro de un archivo que son accesibles desde el exterior es crear una función que devuelva múltiples identificadores de función . En otras palabras, llamaría a su función de definición como
[fun1,fun2,fun3]=defineMyFunctions
, después de lo cual podría usar,out1=fun1(inputs)
etc.fuente
Realmente me gusta la respuesta de SCFrench: me gustaría señalar que se puede modificar fácilmente para importar las funciones directamente al espacio de trabajo utilizando la función de asignación. (Hacerlo de esta manera me recuerda mucho la forma de hacer las cosas "importar x de y" de Python)
Y luego se usa así:
fuente
assignin('caller',...)
Sería más correcto. Es posible que desee utilizar estas funciones desde otra función.En la misma línea que la respuesta de SCFrench, pero con un giro más estilo C #.
Yo haría (y a menudo lo hago) una clase que contiene múltiples métodos estáticos. Por ejemplo:
Como los métodos son estáticos, no necesita instalar la clase. Llama a las funciones de la siguiente manera:
fuente
Defino múltiples funciones en un archivo .m con Octave y luego uso el comando desde dentro del archivo .m donde necesito hacer uso de las funciones de ese archivo:
No estoy seguro si esto está disponible con Matlab.
fuente
También puede agrupar funciones en un archivo principal junto con la función principal que se ve así:
Entonces llamar a subfun1 se vería así: str = main ('subfun1')
fuente
A partir de R2017b, esto no es oficialmente posible. La documentación relevante establece que:
Sin embargo, las soluciones alternativas sugeridas en otras respuestas pueden lograr algo similar.
fuente
He intentado con SCFRench y con Ru Hasha en octava.
Y finalmente funciona: pero he hecho alguna modificación
Se puede llamar en otro archivo 'm':
actualizar:
Agregué una respuesta porque ni el +72 ni el +20 funcionaron en octava para mí. El que escribí funciona perfectamente (y lo probé el viernes pasado cuando más tarde escribí la publicación).
fuente