Что ближе всего MATLAB к пространствам имен?
У нас в лаборатории много кода MATLAB. Проблема в том, что на самом деле нет способа организовать это. Поскольку все функции должны быть в одной папке для вызова (или вы должны добавить кучу папок в MATLAB path
переменная окружения), кажется, мы обречены иметь множество файлов в одной папке, все в глобальном пространстве имен. Есть ли лучший способ организовать наши файлы и функции? Мне бы очень хотелось, чтобы была какая-то модульная система...
4 ответа
В 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. Однако это может привести к большому количеству переписывания кода, которого можно избежать, обновляя путь (есть даже кнопка add with subfolders
если вы добавите папку в путь из File
меню) и делать немного движущегося кода.
РЕДАКТИРОВАТЬ
Если вы хотите организовать свой код так, чтобы некоторые функции были видны только тем функциям, которые вызывают их напрямую (и если вы не хотите переписывать их в ООП), вы помещаете вызывающие функции в каталог, и в этом каталог, вы создаете подкаталог с именем private
, Функции там будут видны только функциям в родительском каталоге. Это очень полезно, если вам приходится перегружать некоторые встроенные функции Matlab для подмножества вашего кода.
Еще один способ организации и повторного использования кода - использование объектно-ориентированных функций matlab. Каждый объект обычно находится в папке, которая начинается с "@" и содержит файлы для этого класса внутри. (хотя новый синтаксис не требует этого для класса, определенного в одном файле.) Используя личные папки внутри папок классов, matlab даже поддерживает закрытые члены класса. Новая запись класса Matlab относительно полнофункциональна, но даже старый синтаксис полезен.
Кстати, мой startup.m
это проверяет известное местоположение, в котором я делаю свои проверки SVN, и автоматически добавляет все подпапки на мой путь.
Система пакетов, вероятно, лучшая. Я использую систему классов (папка @ClassName), но на самом деле пишу объекты. Если вы этого не делаете, глупо просто писать кучу статических методов. Одна вещь, которая может быть полезна, - это поместить весь ваш код Matlab в папку, которая не находится в пути Matlab. Затем вы можете выборочно добавить в путь только тот код, который вам нужен.
Допустим, у вас есть два проекта, которые хранятся в "c:\matlabcode\foo" и "c"\matlabcode\bar", и оба используют общий код, хранящийся в"c:\matlabcode\common ", у вас может быть функция"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
Конечно, вы могли бы продлить это. Очевидным расширением будет включение в каждый каталог текстового файла, в котором будет указано, какие другие каталоги следует добавить к пути для использования функций в этом каталоге.
Еще одна полезная вещь, если вы делитесь кодом, это настроить структуру каталогов "user-only /LabMember", где у вас есть разные члены лаборатории, сохраняющие код, над которым они работают. Таким образом, у вас есть доступ к их коду, если вам это нужно, но не зацикливайтесь, когда они пишут функцию с тем же именем, что и у вас.