Tenemos un montón de código MATLAB en mi laboratorio. El problema es que realmente no hay forma de organizarlo. Como todas las funciones tienen que estar en la misma carpeta para llamar (o debe agregar varias carpetas a la variable de entorno path
de MATLAB), parece que estamos condenados a tener muchos archivos en la misma carpeta, todo en el espacio de nombres global. ¿Hay una mejor manera de organizar nuestros archivos y funciones? Realmente me gustaría que hubiera algún tipo de sistema de módulos ...¿Qué es lo más parecido que MATLAB tiene a los espacios de nombres?
Respuesta
MATLAB tiene una noción de paquetes que se pueden anidar e incluyen tanto clases como funciones.
Simplemente haga un directorio en algún lugar en su camino con un +
como el primer carácter, como +mypkg
. Entonces, si hay una clase o función en ese directorio, se le puede llamar mypkg.mything
. También puede importar desde un paquete usando import mypkg.mysubpkg.*
.
El principal problema de mover un conjunto de funciones en un paquete es que las funciones y clases de no importan automáticamente el paquete que viven en. Esto significa que si tiene un conjunto de funciones en diferentes archivos m que se llaman entre sí, es posible que tenga que pasar un tiempo soltando import
s o llamadas de función calificadoras. No olvide colocar las importaciones en subfunciones que también lo hagan. Más información:
http://www.mathworks.com/help/matlab/matlab_oop/scoping-classes-with-packages.html
Oh. Mi. Dios mío. ¿Por qué nadie me ha hablado de esto? ¡Gracias! – rlbond
Para responder al por qué, es porque hay muchas personas que usan versiones anteriores de MATLAB y esta es una función solo en las versiones más nuevas. –
¿cuál es la versión más antigua de matlab que tiene esta función? – Memming
No veo el problema de tener que agregar alguna carpeta a la ruta de búsqueda de Matlab. He modificado startup.m
para que recursivamente busque directorios en mi directorio de inicio de Matlab y los agregue a la ruta (también ejecuta svn update
en todo). De esta manera, si cambio la estructura del directorio, Matlab todavía verá todas las funciones la próxima vez que lo inicie.
De lo contrario, puede buscar en el código orientado a objetos, donde almacena todos los métodos en una carpeta @objectName. Sin embargo, esto puede conducir a una gran cantidad de código de reescritura que se puede evitar actualizando la ruta (incluso hay un botón add with subfolders
si agrega la carpeta a la ruta desde el menú File
) y haciendo un poco de código de movimiento.
EDITAR
Si desea organizar su código para que algunas funciones son accesibles solamente a las funciones que les llaman directamente (y si no desea volver a escribir en la programación orientada a objetos), se ponga las funciones de llamada en un directorio, y dentro de este directorio, cree un subdirectorio llamado private
. Las funciones allí solo serán visibles para las funciones en el directorio padre. Esto es muy útil si tiene que sobrecargar algunas funciones integradas de Matlab para un subconjunto de su código.
Otra forma de organizar la reutilización de código & está utilizando características orientadas a objetos de MATLAB. Cada objeto está habitualmente en una carpeta que comienza con una "@" y tiene el archivo (s) para esa clase dentro. (aunque la sintaxis más reciente no requiere esto para una clase definida en un único archivo.) Utilizando carpetas privadas dentro de las carpetas de la clase, matlab incluso admite miembros privados de la clase. El new class notation de Matlab es relativamente completo, pero incluso el old syntax es útil.
BTW, mi startup.m
que examina una ubicación conocida a la que hago mis comprobaciones SVN, y agrega todas las subcarpetas a mi ruta automáticamente.
El sistema de paquete es probablemente el mejor. Utilizo el sistema de clases (carpeta @ClassName), pero en realidad escribo objetos.Si no estás haciendo eso, es una tontería simplemente escribir un montón de métodos estáticos. Una cosa que puede ser útil es poner todo su código de matlab en una carpeta que no está en la ruta de Matlab. Luego puede agregar selectivamente solo el código que necesita a la ruta.
Digamos que tiene dos proyectos, almacenados en "c: \ matlabcode \ foo" y "c" \ matlabcode \ bar ", que usan código común almacenado en" c: \ matlabcode \ common ", es posible que tenga una función "setupPaths.m" de esta manera:
function setupPaths(projectName)
basedir = fullfile('c:', 'matlabcode');
addpath(genpath(fullfile(basedir, projectName)));
switch (projectName)
case {'foo', 'bar'}
addpath(genpath(fullfile(basedir, 'common')));
end
por supuesto que podría extender esta una extensión obvia sería incluir un archivo de texto en cada directorio de decir lo que otros directorios, debe añadirse a la ruta a utilizar el. funciones en ese directorio.
Otra cosa útil si compartes el código es configurar una estructura de directorios "específica del usuario/LabMember", donde tienes diferentes miembros de laboratorio que guardan el código están trabajando en. De esta forma, tendrá acceso a su código si lo necesita, pero no se deje abatir cuando escriba una función con el mismo nombre que la suya.
- 1. ¿Qué es lo más parecido a hash en Erlang?
- 2. ¿Qué es lo más parecido que Java tiene a los delegados .NET Func <> y Action <>?
- 3. ¿Qué es lo más cercano a #define en Matlab?
- 4. ¿Qué es lo más parecido a Windows COM/DCOM en el mundo de Linux?
- 5. ¿Qué es lo más parecido a Apache Hadoop en otros idiomas?
- 6. ¿Por qué Objective-C no tiene espacios de nombres?
- 7. ¿Qué es lo más parecido a SLIME para python?/¿Cuál es la mejor manera de usar python de EMACS?
- 8. ¿Por qué Octave es más lento que MATLAB?
- 9. MATLAB parfor es más lento que para - ¿qué pasa?
- 10. ¿Por qué hay espacios de nombres XAML que son URLS?
- 11. ¿Es MATLAB más rápido que Python?
- 12. ¿Para qué son los espacios de nombres XML?
- 13. En Java, ¿qué es idónicamente más parecido a generar un Python ValueError?
- 14. espacios Extracción y todo lo que no es alfanumérico
- 15. ¿Cuál es la forma más confiable de usar GNUMake con nombres de archivos que contienen espacios?
- 16. ¿Por qué múltiples espacios de nombres?
- 17. ¿Tiene IntelliJ el asistente de espacios de nombres Spring?
- 18. ¿Qué es lo opuesto a "es"?
- 19. ¿Qué significa el sufijo `X` en los espacios de nombres?
- 20. ie9-js - ¿tiene algo más que lo hace obsoleto?
- 21. PowerShell: acorta los nombres del espacio de nombres para que sea más fácil acceder a los tipos
- 22. ¿Qué tiene un solo espacio de nombres que conduce a macros antihigiénicos? (en LISP)
- 23. ¿Qué herramienta/aplicación/qué es lo que desea que exista?
- 24. XDocument que contiene espacios de nombres
- 25. Revisión de código: cómo detener a los programadores que usan espacios de nombres/funcionalidad específicos
- 26. ¿Hay alguna manera de decirle a Doxygen que ignore (todos) los espacios de nombres?
- 27. ¿C# 4 optimiza los espacios de nombres ausentes de una manera que las versiones anteriores de C# no lo hicieron?
- 28. ¿Cómo se buscan los espacios de nombres de clojure?
- 29. ¿Espacios de nombres en Redis?
- 30. ¿Qué espacios de nombres de símbolos hay en Haskell?
Vea también http://stackoverflow.com/questions/2326609/how-to-organize-matlab-code –