Какова самая близкая вещь, которую MATLAB имеет к пространствам имен?

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

53
задан rlbond 30 April 2010 в 12:58
поделиться

4 ответа

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

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

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

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

71
ответ дан 7 November 2019 в 08:41
поделиться

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

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

РЕДАКТИРОВАТЬ

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

9
ответ дан 7 November 2019 в 08:41
поделиться

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

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

8
ответ дан 7 November 2019 в 08:41
поделиться

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

6
ответ дан 7 November 2019 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: