suptitle - subplot matlab
¿Qué es lo más parecido que MATLAB tiene a los espacios de nombres? (4)
Tenemos mucho 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 ser llamadas (o debe agregar un grupo de carpetas a la variable de entorno de 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 ...
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.
Así que supongamos 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 "como esto:
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, podrías extender esto. Una extensión obvia sería incluir un archivo de texto en cada directorio que indique qué otros directorios se deberían agregar a la ruta para usar las funciones en ese directorio.
Otra cosa útil si compartes código es configurar una estructura de directorios "específica del usuario / LabMember", donde tienes diferentes miembros de laboratorio que guardan el código en el que están trabajando. 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.
MATLAB tiene una noción de paquetes que se pueden anidar e incluir tanto clases como funciones.
Simplemente crea un directorio en algún lugar de tu camino con un +
como 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 utilizando import mypkg.mysubpkg.*
.
El principal tema sobre mover un conjunto de funciones en un paquete es que las funciones y clases no importan automáticamente el paquete en el que viven . 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 dejando caer las llamadas de import
o calificación. 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
No veo el problema de tener que agregar alguna carpeta a la ruta de búsqueda de Matlab. He modificado startup.m
para que busque recursivamente 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 llevar a una gran cantidad de código de reescritura que puede evitarse 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 solo sean visibles para las funciones que las llaman directamente (y si no desea volver a escribir en OOP), ponga las funciones de llamada en un directorio, y dentro de este directorio, usted crea 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 y reutilizar el código es usar las funciones 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. La nueva notación de clase de Matlab es relativamente completa, pero incluso la vieja sintaxis es útil.
Por cierto, mi startup.m
que examina una ubicación conocida a la que hago mis pagos SVN, y agrega todas las subcarpetas a mi ruta automáticamente.