У нас есть много кода MATLAB в моей лаборатории. Проблема нет действительно никакого способа организовать ее. Так как все функции должны быть в той же папке, которую назовут (или необходимо добавить набор папок к MATLAB path
переменная среды), кажется, что мы обречены, имеют загрузки файлов в той же папке, всех в глобальном пространстве имен. Существует ли лучший способ организовать наши файлы и функции? Мне действительно жаль, что не было своего рода системы модуля...
MATLAB имеет понятие пакетов, которые могут быть вложенными и включать как классы, так и функции.
Просто создайте каталог где-нибудь на своем пути с +
в качестве первого символа, например + mypkg
. Затем, если в этом каталоге есть класс или функция, он может называться mypkg.mything
. Вы также можете импортировать из пакета, используя import mypkg.mysubpkg. *
.
Основная проблема, связанная с перемещением группы функций в пакет, заключается в том, что функции и классы не импортируют автоматически пакет, в котором они находятся . Это означает, что если у вас есть куча функций в разных m-файлах, которые вызывают друг друга, вам, возможно, придется потратить некоторое время на отбрасывание import
s или квалификационные вызовы функций.Не забудьте поместить импорт в вызываемые подфункции. Дополнительная информация:
http://www.mathworks.com/help/matlab/matlab_oop/scoping-classes-with-packages.html
Я не вижу проблемы с необходимостью добавления какой-либо папки в путь поиска Matlab. Я изменил startup.m
, чтобы он рекурсивно просматривал каталоги в моем каталоге запуска Matlab и добавлял их в путь (он также запускает svn update
для всего). Таким образом, если я изменю структуру каталогов, Matlab по-прежнему увидит все функции при следующем запуске.
В противном случае вы можете изучить объектно-ориентированный код, где вы храните все методы в папке @objectName. Однако это может привести к переписыванию большого количества кода, чего можно избежать, обновив путь (есть даже кнопка добавить с подпапками
, если вы добавляете папку к пути из файла
меню) и немного меняем код.
РЕДАКТИРОВАТЬ
Если вы хотите организовать свой код так, чтобы некоторые функции были видны только функциям, вызывающим их напрямую (и если вы не хотите переписывать в ООП), вы помещаете вызывающие функции в каталоге и внутри этого каталога вы создаете подкаталог с именем private
. Функции в нем будут видны только функциям в родительском каталоге. Это очень полезно, если вам нужно перегрузить некоторые встроенные функции Matlab для подмножества вашего кода.
Другой способ организации и повторного использования кода - использование объектно-ориентированных функций Matlab. Каждый объект обычно находится в папке, которая начинается с символа «@» и содержит файл (ы) для этого класса внутри. (хотя новый синтаксис не требует этого для класса, определенного в одном файле.) Используя частные папки внутри папок классов, Matlab даже поддерживает частные члены класса. Нотация нового класса в Matlab относительно полнофункциональна, но даже старый синтаксис полезен.
Кстати, мой startup.m
, который проверяет хорошо известное место, в котором я выполняю свои проверки SVN, и автоматически добавляет все подпапки на мой путь.
Система пакетов, вероятно, лучшая. Я использую систему классов (папка @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», где у вас есть разные члены лаборатории, сохраняющие код, над которым они работают. Таким образом, у вас будет доступ к их коду, если он вам нужен, но не расстраивайтесь, когда они пишут функцию с тем же именем, что и одна из ваших.