Генерация графа вызовов из кода Matlab SRC - PullRequest
13 голосов
/ 14 сентября 2011

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

Кто-нибудь знаком с какими-либо инструментами или плагинами?

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

Ответы [ 4 ]

11 голосов
/ 16 сентября 2011

Позвольте мне предложить M2HTML , инструмент для автоматической генерации HTML-документации ваших m-файлов MATLAB.Среди его списка возможностей:

  • Находит зависимости между функциями и генерирует граф зависимостей (с помощью точечного инструмента GraphViz)
  • Автоматическая перекрестная ссылка на функции и подфункции с их определением висходный код

Посетите эту страницу demo , чтобы увидеть пример вывода этого инструмента.

9 голосов
/ 15 сентября 2011

Я рекомендую изучить использование функции depfun для построения графа вызовов.См. http://www.mathworks.com/help/techdoc/ref/depfun.html для получения дополнительной информации.

В частности, я обнаружил, что вызов depfun с аргументом '-toponly' с последующим повторением результатов является отличным способом создания вызоваГрафик от руки.К сожалению, у меня больше нет доступа к любому коду, который я написал, используя это.

5 голосов
/ 14 сентября 2011

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

Взгляните на MATLAB Code Profiler . Выполните ваш код следующим образом:

>> profile on -history; MyCode; profile viewer
>> p = profile('info');

p содержит историю функций. На той же странице справки, на которую я ссылался выше:

Данные истории описывают последовательность функций, введенных и вышедших во время выполнения. Команда profile возвращает данные истории в поле FunctionHistory структуры, которую она возвращает. Данные истории представляют собой массив размером 2 на n. Первая строка содержит логические значения, где 0 означает вход в функцию, а 1 означает выход из функции. Вторая строка идентифицирует функцию, которая вводится или выходит из ее индекса в поле FunctionTable. Этот пример [ниже] читает данные истории и отображает их в командном окне MATLAB.

profile on -history
plot(magic(4));
p = profile('info');

for n = 1:size(p.FunctionHistory,2)
 if p.FunctionHistory(1,n)==0
        str = 'entering function: ';
 else
        str = 'exiting function: ';
 end
 disp([str p.FunctionTable(p.FunctionHistory(2,n)).FunctionName])
end

Вам не обязательно отображать входные и выходные вызовы, как в примере выше; Достаточно просто посмотреть на p.FunctionTable и p.FunctionHistory, чтобы увидеть, когда код входит и выходит из функций.

0 голосов
/ 09 июня 2016

Я согласен с ответом m2html, я просто хотел сказать, что следующий пример из документации m2html / mdot хорош:

mdot('m2html.mat','m2html.dot');
!dot -Tps m2html.dot -o m2html.ps
!neato -Tps m2html.dot -o m2html.ps

Но мне повезло с экспортом в pdf:

mdot('m2html.mat','m2html.dot');
!dot -Tpdf m2html.dot -o m2html.pdf

Кроме того, прежде чем пытаться выполнить приведенные выше команды, вы должны выполнить что-то вроде следующего:

m2html('mfiles','..\some\dir\with\code\','htmldir','doc_dir','graph','on')
...