Что ближе всего MATLAB к пространствам имен?

46

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

Теги:
namespaces

4 ответа

67
Лучший ответ

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

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

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

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

  • 8
    Ой. Мои. Гоша. Почему никто не сказал мне об этом? Спасибо!
  • 1
    Чтобы ответить на вопрос «почему», это потому, что есть много людей, которые используют более старые версии MATLAB, и это функция только в более новых версиях.
Показать ещё 5 комментариев
8

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

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

ИЗМЕНИТЬ

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

  • 2
    Моя проблема с этим заключается в том, что все функции находятся в глобальном пространстве имен, то есть нет способа вызвать функцию subfolder1\myFunc(1,2,3)
  • 2
    Если вы хотите скрыть функции из глобального пространства имен, вы можете использовать private папки. Смотрите редактировать.
6

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

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

5

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню