18 Stimmen

Automatische Generierung eines Diagramms für Funktionsaufrufe in MATLAB

Kennt jemand ein Tool, mit dem man automatisch eine Diagramme von Funktionsaufrufen in MATLAB?

Für eine gegebene Funktion würde das Tool beispielsweise rekursiv durch Funktionsaufrufe gehen und einen 2D-Graphen erstellen, in dem Knoten Funktionen darstellen und gerichtete Kanten aufrufende Funktionen mit aufgerufenen Funktionen verbinden würden.

Idealerweise könnte das Tool dem Benutzer erlauben, Filter ein- und auszuschalten, um nur benutzerdefinierte Funktionen einzubeziehen, die Tiefe der Rekursion zu begrenzen, usw.

Ich glaube Doxygen bietet einige ähnliche Funktionen für traditionellere OOP Sprachen, aber ich habe mich gefragt, ob es so etwas bereits für MATLAB gibt.

Gracias.

27voto

Andrew Janke Punkte 23072

Sie können die Techniken aus den anderen Antworten, auf die im Kommentar von gnovice verwiesen wird, verwenden, um eine Liste der Funktionsabhängigkeiten als (A,B)-Paare zu erhalten, wobei A B aufruft. GraphViz und verwenden Sie es, um die Diagramme zu erstellen. Sie können die .dot-Dateien von Matlab aus etwa wie folgt erstellen.

function createFunctionDependencyDotFile(calls)
%CREATEFUNCTIONDEPENDENCYDOTFILE Create a GraphViz DOT diagram file from function call list
%
% Calls (cellstr) is an n-by-2 cell array in format {caller,callee;...}.
%
% Example:
% calls = { 'foo','X'; 'bar','Y'; 'foo','Z'; 'foo','bar'; 'bar','bar'};
% createFunctionDependencyDotFile(calls)

baseName = 'functionCalls';
dotFile = [baseName '.dot'];
fid = fopen(dotFile, 'w');
fprintf(fid, 'digraph G {\n');
for i = 1:size(calls,1)
    [parent,child] = calls{i,:};
    fprintf(fid, '   "%s" -> "%s"\n', parent, child);
end
fprintf(fid, '}\n');
fclose(fid);

% Render to image
imageFile = [baseName '.png'];
% Assumes the GraphViz bin dir is on the path; if not, use full path to dot.exe
cmd = sprintf('dot -Tpng -Gsize="2,2" "%s" -o"%s"', dotFile, imageFile);
system(cmd);
fprintf('Wrote to %s\n', imageFile);

enter image description here

GraphViz eignet sich hervorragend für viele andere Baum- und Graphenanwendungen, wie z. B. Klassenvererbung und Abhängigkeitsbäume, Datenfluss und so weiter.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X