2010-04-30 18 views
47

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?

+1

Vea también http://stackoverflow.com/questions/2326609/how-to-organize-matlab-code –

Respuesta

64

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

+8

Oh. Mi. Dios mío. ¿Por qué nadie me ha hablado de esto? ¡Gracias! – rlbond

+1

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. –

+0

¿cuál es la versión más antigua de matlab que tiene esta función? – Memming

8

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.

+2

Mi problema con esto es que todas las funciones están en el espacio de nombres global, es decir, no hay forma de llamar a la función ' subfolder1 \ myFunc (1,2,3) ' – rlbond

+2

Si desea ocultar funciones del espacio de nombres global, puede usar carpetas' privadas'. Ver editar. – Jonas

6

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.

5

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.

Cuestiones relacionadas