Что ближе всего MATLAB к пространствам имен? - PullRequest
52 голосов
/ 01 мая 2010

У нас в лаборатории много кода MATLAB. Проблема в том, что на самом деле нет способа организовать это. Поскольку все функции должны быть в одной папке для вызова (или вам нужно добавить кучу папок в переменную окружения MATLAB path), кажется, что мы обречены иметь множество файлов в одной папке, все в глобальном пространстве имен. Есть ли лучший способ организовать наши файлы и функции? Мне бы очень хотелось, чтобы была какая-то модульная система ...

Ответы [ 4 ]

71 голосов
/ 01 мая 2010

В MATLAB есть понятие пакетов, которые могут быть вложенными и включать в себя как классы, так и функции.

Просто создайте каталог где-нибудь на вашем пути с + в качестве первого символа, например +mypkg. Затем, если в этом каталоге есть класс или функция, его можно назвать mypkg.mything. Вы также можете импортировать из пакета, используя import mypkg.mysubpkg.*.

Единственный главный момент при переносе группы функций в пакет состоит в том, что функции и классы не импортируют автоматически пакет, в котором они живут, . Это означает, что если у вас есть несколько функций в разных m-файлах, которые вызывают друг друга, вам, возможно, придется потратить некоторое время на сброс import s или уточнение вызовов функций. Не забудьте поместить импорт в подфункции, которые также вызывают. Дополнительная информация:

http://www.mathworks.com/help/matlab/matlab_oop/scoping-classes-with-packages.html

9 голосов
/ 01 мая 2010

Я не вижу проблемы с необходимостью добавить какую-либо папку в путь поиска Matlab. Я изменил startup.m, чтобы он рекурсивно искал каталоги в моем каталоге запуска Matlab и добавил их в путь (он также запускает svn update для всего). Таким образом, если я изменю структуру каталогов, Matlab по-прежнему будет видеть все функции при следующем запуске.

В противном случае вы можете посмотреть на объектно-ориентированный код, где вы храните все методы в папке @objectName. Однако это может привести к переписыванию большого количества кода, которого можно избежать, обновив путь (даже есть кнопка add with subfolders, если вы добавляете папку к пути из меню File) и сделав немного движущийся код.

EDIT

Если вы хотите организовать свой код так, чтобы некоторые функции были видны только функциям, которые их вызывают напрямую (и если вы не хотите переписывать в ООП), вы помещаете вызывающие функции в каталог, и внутри этого каталога вы создаете подкаталог с именем private. Функции там будут видны только функциям в родительском каталоге. Это очень полезно, если вам приходится перегружать некоторые встроенные функции Matlab для подмножества вашего кода.

8 голосов
/ 02 мая 2010

Еще один способ организации и повторного использования кода - использование объектно-ориентированных функций matlab. Каждый объект обычно находится в папке, которая начинается с «@» и содержит файлы для этого класса внутри. (хотя новый синтаксис не требует этого для класса, определенного в одном файле.) Используя личные папки внутри папок классов, matlab даже поддерживает закрытые члены класса. новая запись класса Matlab относительно полнофункциональна, но даже старый синтаксис полезен.

Кстати, мой startup.m, который проверяет известное местоположение, в котором я делаю мои проверки SVN, и автоматически добавляет все подпапки на мой путь.

6 голосов
/ 04 мая 2010

Система пакетов, вероятно, лучшая. Я использую систему классов (папка @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-user / LabMember", где у вас есть разные члены лаборатории, сохраняющие код, над которым они работают. Таким образом, у вас есть доступ к их коду, если вам это нужно, но не зацикливайтесь, когда они пишут функцию с тем же именем, что и у вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...