Как визуализировать структуру проекта в MATLAB?

49

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

  • 0
    Было бы неплохо, если бы компания codegears начала ориентироваться на исходный код Matlab для своих сложных инструментов CASE . Навигация по огромным взаимосвязям процедурного кода Matlab может быть очень болезненной. Я бы сказал, что постепенно начинайте обновлять исходный код, чтобы хотя бы начать использовать объектно-ориентированное программирование, которое теперь поддерживается .
Теги:
visualization
refactoring

7 ответов

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

Порт в NumPy.

(Шутка.)

Обычно в Matlab у вас есть файлы, написанные как функции, а некоторые - как скрипты. Скрипты выполняют такие функции, как загрузка данных, которые вы хотите обработать, и подаете их на функции, и нарисуйте их.

Чтобы организовать вещи, которые я начал бы на верхнем уровне script, и выяснить, какие функции выполняют загрузка, графическое оформление, обработка и т.д. Храните сценарии в каталоге верхнего уровня и пытайтесь отделить эти функции от подкаталогов, в соответствии с с целью функции. Поместите зависимости функции в один и тот же подкаталог. Постарайтесь сделать так, чтобы ни один код в каталоге не зависел ни от чего в родительском каталоге (или каталоге кузена).

Всякий раз, когда вы выясняете, что делает функция и какие ее аргументы, напишите комментарий к документу.

Это предполагает, что человек, который написал код, был разумным. Если нет, Matlab упрощает выкладывать все в один каталог и все зависит от всего остального в шаткой башне кода, поэтому вы можете в конечном итоге сделать много рефакторинга.

  • 13
    Хаха, полностью согласен с первой строчкой твоего ответа! :-) Matlab довольно ужасен, когда дело доходит до организации кода.
  • 3
    @ Оливье - правда. Один из главных недостатков. Но опять же, это не очень подходит для больших приложений. Это было больше предназначено для быстрого и го использования.
Показать ещё 5 комментариев
14

Имеет ли ваш код подходящий текст справки? В этом случае m2html будет большой помощью, так как это позволяет вам создать связанную html-справку для удобного просмотра.

Кроме того, он позволяет создавать графики зависимостей, которые помогут вам понять немного больше, как вы можете организовать код.

  • 0
    m2html очень хорош - спасибо
  • 0
    Получить весь граф зависимостей между каталогами немного неочевидно, но объяснено в FAQ artefact.tk/software/matlab/m2html/faq.php
12

Мне приходилось много раз заниматься этой проблемой в моих различных ролях в The MathWorks. Это то, что я делаю для больших фрагментов кода MATLAB:

  • Сделайте резервную копию, может быть, дважды!
  • Выбрать все, Ctrl-I для интеллектуального отступа
  • Выделить все, Ctrl-J, чтобы обернуть комментарии

  • Если я чувствую бумагу - распечатайте все файлы и получайте набор маркеров - следуйте вручную, выделив долгосрочные переменные и важные вызовы функций.

~~~ AND/OR ~~~

5 Если мне повезет, запустите код в отладчике, пройдя через по одной строке за раз (вступая в подфункции, которые были написаны пользователем)

В этот момент я могу пройти и следовать типичному потоку через структуру управления. У меня, возможно, нет отличной идеи, что все делает, но у меня есть приличное представление о том, что происходит.

Обычно моя цель - найти ошибку, решить ее и продолжить. Ваши цели могут быть совершенно разными. Это метод, который я использовал, чтобы быстро постигнуть хрустали разных частей кода MATLAB, которые я отправил с годами.

  • 1
    +1 для ярлыков ctr-i
  • 0
    Спорьте в ковбой Даг! Мне нравится ваш стиль, очень берут на себя ответственность, делайте это и катайтесь с ударами. Хорошая работа B-)
7

Руководство по стилю программирования MATLAB от Ричарда Джонсона - хороший ресурс.

6

некоторые предложения относительно соглашения о кодировании Matlab:

  • использовать addpath для предотвращения загромождения файлов и оказания помощи в функциях taxnomony

  • Разбить раздел_ для функциональных скриптов или установить для условных прогонов, это также может помочь в модулях plug-in/out и повторного использования или ссылки на код.

  • используйте конфигурационный файл для включения и выключения параметров

  • имеют общий обзор архитектурного набора конструкций, а также modus operandi
  • сохранить файл status/readme (рассматривать себя как нового пользователя, как бы вы помогли сделать его ассимилируемым как часть собственного модуля или части решений для нового пользователя, если вы вернетесь к коду 3 спустя несколько месяцев чувствуя себя потерянным или неспособным проследить - что-то не так.) Мое предложение: держите журнал, чтобы уточнить свои мысли о сохранении искусных проектов. Продолжайте совершенствовать свое искусство!
  • для уравнений, используйте латекс для документирования (и храните его в ближайшей папке под названием, например, документы, убедитесь, что они легко доступны и прослеживаются - если вам нужно использовать "поиск" на вашем диске, что-то не так с управлением проектами )
  • разбить коды на короткие модули для локализации и более короткие коды, с меньшей прокруткой, коды будут легче отслеживать.
  • использовать значащие переменные и имена функций (стиль java кажется приятным, например, "backedupDataForVerification" ), не ограничивайте, чтобы сократить слова, вы будете страдать позже
  • при проектировании, подумайте, следует ли использовать функцию, скриптинг или OO (объектно-ориентированный)
  • Не спешите с преждевременной оптимизацией, поскольку скорость Matlab - не лучший выбор. Если вам действительно нужно, не сохраняйте ни одну оптимизированную версию для сопоставления со стороны на стороне, устранение неполадок и отладка не будут меньше проклятия.
  • Всегда, всегда, всегда комментируйте свои коды. Никогда не используйте оправдание тому, что у вас нет времени, вы потеряете больше времени.
  • для дифференцирования, рассмотрите возможность установки нового node для модификации кода, например. установите дерево, чтобы отличать версии.

  • используйте отдельную папку для входов/выходов, изображений, промежуточных результатов и т.д.

  • использовать временную метку для отслеживания версий

  • делитесь своими кодами с кем-то другим, если им сложно поддерживать, использовать или модифицировать, переосмыслить, как уточнить ваши сборки.

3

Назад все правильно. Создайте первоначальный tarball исходного исходного дерева, а затем бросьте все это в исходное управление, чтобы вы могли отслеживать и откатывать свои изменения.

Посмотрите на Matlab depfun() и depdir(), которые обнаруживают статические зависимости. Это может помочь вам увидеть зависимости между функциями Matlab. С "depfun -toponly" во всех файлах и небольшим перетасовкой строк вы можете создать список непосредственных зависимостей и бросить это в файле GraphViz, чтобы создать большой ориентированный граф ваших кодовых подключений. Кластеры на графике могут быть хорошим местом для разделения кода. (EDIT: см. Решение Jonas, похоже, что m2html делает это для вас.)

Если у вас есть большая свобода для перезаписи кода, подумайте о том, чтобы переписать часть кода как объекты, используя классы утилиты без состояния с методами класса и частными функциями в качестве способов объединения связанных функций и обеспечения некоторой инкапсуляции. Я работал с довольно большими кодовыми базами Matlab, организованными таким образом, и все работает. В классическом Matlab классы - это ваш единственный способ сделать какие-то пакеты. Я считаю, что новая система OO Matlab также поддерживает пространство имен.

Если вы не хотите конвертировать код в OO, вы можете организовать связанные функции в подкаталогах. Это помогает организовать его для просмотра исходного кода, по крайней мере.

Все функции должны иметь некоторую doco в стандартном формате hellext Matlab, включая строку H1. Если они этого не сделают, напишите комментарии о том, что вы там узнали. Затем используйте инструмент "contentrpt" для автоматического создания файлов оглавления для классов или каталогов.

Удачи.

  • 1
    Смотрите комментарий ниже на m2html. Он может генерировать графики зависимости для вас.
  • 0
    Каково определение «вспомогательного класса без сохранения состояния» в Matlab? можете ли вы указать мне некоторые документы?
Показать ещё 2 комментария
2

Я согласен с большинством комментариев о том, что Matlab не ужасно поддерживает современную структуру исходного кода программного обеспечения, но я не считаю, что слишком сложно навязать некоторые из ваших собственных структур с небольшой дисциплиной.

Организуйте исходные файлы в иерархию каталогов, как и исходные файлы для любой программы, написанной на другом языке программирования. Вам не нужно придерживаться иерархии, если хотите, выберите свою структуру. Используйте команду setpath (или что бы там ни говорилось), чтобы сообщить Matlab, где искать ваши файлы m, когда вы работаете.

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

Конечно, все наши файлы m находятся в репозитории, и мы их обслуживаем. Мы держим частный инструментарий на одном из наших сетевых дисков, и все пользователи могут напрямую вызвать "выпущенный" код в этом ящике инструментов.

  • 7
    Я не согласен с тем, что Matlab не поддерживает. Это просто не накладывает на вас никаких структурных требований - вы должны быть организованы.
  • 1
    некоторые функции могут отсутствовать, однако мы можем организовать и улучшить нашу собственную утилиту для отслеживания. По сути, система строится людьми, и мы можем создавать свои собственные дополнения.

Ещё вопросы

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