В моей лаборатории много кода MATLAB. Проблема в том, что на самом деле нет способа организовать его. Поскольку все функции должны быть в одной и той же папке (или вам нужно добавить кучу папок в переменную среды MATLAB path
), кажется, что мы обречены иметь множество файлов в одной папке, все в глобальном пространстве имен. Есть ли лучший способ организовать наши файлы и функции? Мне очень жаль, что есть какая-то модульная система...
Какова ближайшая вещь, которую MATLAB имеет для пространств имен?
Ответ 1
В MATLAB есть понятие пакетов, которые могут быть вложенными и включать оба класса и функции.
Просто создайте каталог где-то на вашем пути с +
как первый символ, например +mypkg
. Тогда, если в этом каталоге есть класс или функция, его можно назвать mypkg.mything
. Вы также можете импортировать из пакета с помощью import mypkg.mysubpkg.*
.
Один из основных способов переместить кучу функций в пакет - это то, что функции и классы не автоматически импортируют пакет, в котором они живут. Это означает, что если у вас есть куча функций в разных m файлах, которые называют друг друга, вам, возможно, придется потратить некоторое время на отбрасывание import
в или квалификационные вызовы функций. Не забывайте также вводить импорт в подфункции, которые также вызываются. Дополнительная информация:
http://www.mathworks.com/help/matlab/matlab_oop/scoping-classes-with-packages.html
Ответ 2
Я не вижу проблемы с добавлением некоторой папки в путь поиска Matlab. Я изменил startup.m
так, что он рекурсивно ищет каталоги в моем каталоге запуска Matlab и добавляет их в путь (он также запускает svn update
на все). Таким образом, если я изменил структуру каталогов, Matlab все еще увидит все функции при следующем запуске.
В противном случае вы можете посмотреть на объектно-ориентированный код, где хранятся все методы в папке @objectName. Однако это может привести к большому количеству перезаписывающего кода, которого можно избежать, обновив путь (есть даже кнопка add with subfolders
, если вы добавите папку в путь из меню File
) и выполните немного движущийся код.
ИЗМЕНИТЬ
Если вы хотите организовать свой код, чтобы некоторые функции были видны только для функций, вызывающих их напрямую (и если вы не хотите переписывать в ООП), вы помещаете вызывающие функции в каталог, и внутри этого каталога вы создаете подкаталог под названием private
. Функции там будут видны только функциям родительского каталога. Это очень полезно, если вам нужно перегрузить некоторые встроенные функции Matlab для подмножества вашего кода.
Ответ 3
Другим способом организации и повторного использования кода является использование объектно-ориентированных функций matlab. Каждый объект обычно находится в папке, которая начинается с "@" и имеет файлы для этого класса внутри. (хотя новый синтаксис не требует этого для класса, определенного в одном файле.) Используя частные папки внутри папок классов, Matlab даже поддерживает частные члены класса. Matlab нотация нового класса является относительно полнофункциональной, но даже старый синтаксис.
BTW, my startup.m
, который исследует известное местоположение, в котором я делаю свои SVN-проверки, и автоматически добавляет все подпапки на мой путь.
Ответ 4
Пакетная система, вероятно, самая лучшая. Я использую систему классов (папка @ClassName), но я фактически пишу объекты. Если вы этого не делаете, глупо просто написать кучу статических методов. Одна вещь, которая может быть полезна, состоит в том, чтобы поместить весь ваш код в MATLAB в папку, которая не находится на пути matlab. Затем вы можете выборочно добавить только код, который вам нужен для пути.
Итак, у вас есть два проекта, хранящихся в "c:\matlabcode\foo" и "c" \matlabcode\bar ", которые используют общий код, хранящийся в" c:\matlabcode\common ", у вас может быть function" setupPaths.m" следующим образом:
function setupPaths(projectName)
basedir = fullfile('c:', 'matlabcode');
addpath(genpath(fullfile(basedir, projectName)));
switch (projectName)
case {'foo', 'bar'}
addpath(genpath(fullfile(basedir, 'common')));
end
Конечно, вы можете расширить это. Очевидным расширением будет включение текстового файла в каждый каталог, указывающий, какие другие каталоги должны быть добавлены в путь для использования функций в этом каталоге.
Еще одна полезная вещь, если вы используете общий код, - это создать структуру каталогов, специфичную для пользователя /LabMember, где у вас есть разные члены лаборатории, которые сохраняют код, над которым они работают. Таким образом, у вас есть доступ к их коду, если он вам нужен, но не сжимайтесь, когда они пишут функцию с тем же именем, что и ваша.