Wie man die Adjazenzmatrix mit MATLAB graphisch darstellt

8

Ich möchte ein Diagramm erstellen, das Verbindungen zwischen Knoten aus einer Adjazenzmatrix wie der folgenden zeigt.

gplot scheint das beste Werkzeug dafür zu sein. Um es zu verwenden, muss ich jedoch die Koordinaten jedes Knotens übergeben. Das Problem ist, dass ich nicht weiß, wo die Koordinaten sein sollten, ich hatte gehofft, dass die Funktion in der Lage wäre, ein gutes Layout für mich herauszufinden.

Hier ist zum Beispiel meine Ausgabe mit den folgenden willkürlichen Koordinaten:

%Vor%

Was schwer zu lesen ist, aber wenn ich mit den Koordinaten ein wenig herumspiele und sie zu den folgenden verändere, wird es viel lesbarer.

%Vor%

Ich erwarte keine perfekt optimierten Koordinaten oder irgendetwas anderes, aber wie kann ich MATLAB sagen, dass es automatisch eine Reihe von Koordinaten für mich herausfinden soll, die mit einer Art Algorithmus , damit ich etwas zeichnen kann, das wie das obere Bild aussieht.

Vielen Dank im Voraus.

    
Charles Clayton 07.12.2014, 05:26
quelle

3 Antworten

5

Ab R2015b verfügt MATLAB jetzt über eine Reihe von Grafik- und Netzwerkalgorithmen. In diesem Beispiel können Sie ein ungerichtetes Diagrammobjekt erstellen und es dann mit überladene plot Funktion :

%Vor%

    
KQS 24.10.2016, 22:20
quelle
4

Ein Weg wäre, Ihren eigenen Algorithmus mit einer Art elektrostatischer Abstoßung zu schreiben, wie es in dem von Ihnen verlinkten Papier der Fall ist. Kann wahrscheinlich in weniger als 40 Zeilen von Matlab gemacht werden (es scheint, andere haben versucht ) . Aber manchmal ist es besser, externe Tools zu verwenden, als alles in Matlab zu tun. Das beste Werkzeug zum Zeichnen von Graphen ist wahrscheinlich Graphviz , das mit einer Reihe von Werkzeugen zum Zeichnen verschiedener Stilgraphen ausgestattet ist. Bei ungerichteten Graphen ist neato zu verwenden. Ich weiß nicht, welchen Algorithmus es verwendet, um die Knoten zu verteilen, aber ich denke, es ist etwas ähnlich zu denen in Ihrer Arbeit (eine der Referenzen erwähnt sogar Graphviz!).

Die Eingabe für diese Werkzeuge ist ein sehr einfaches Textformat, das einfach mit Matlab erzeugt werden kann. Beispiel (das funktioniert unter Linux, Sie müssen es vielleicht ein wenig unter Windows ändern):

%Vor%

Was die Datei test.dot ergibt:

%Vor%

und schließlich ein Bild test.png (beachten Sie, dass Ihre Adjazenzmatrix eine Verbindung des ersten Elements mit sich selbst auflistet, die als Schleife an Knoten A angezeigt wird):

Als komplexeres Beispiel können Sie einen Bucky-Ball wie in der Dokumentation von gplot :

darstellen %Vor%

mit Ergebnis (beachten Sie, dass das Layout von neato ausgeführt wird, es verwendet nicht XY ):

    
Bas Swinckels 07.12.2014 13:33
quelle
0

Wenn Ihr Graph verbunden ist, besteht eine Möglichkeit, das Array xy so zu konstruieren, dass es an gplot übergeben wird, wie v (:, [2 3]) wobei v die Matrix der Eigenvektoren der Laplace-Matrix ist, geordnet von kleinsten Eigenwerten zu größten. Also können wir es so machen:

%Vor%

oder so:

%Vor%

Der zweite sollte effizienter sein, besonders wenn A groß ist.

Dies wird unter normalen Umständen eine nette Handlung erzeugen. Dies funktioniert nicht garantiert; insbesondere ist es nicht garantiert, verschiedenen Knoten unterschiedliche Koordinaten zuzuordnen. Aber normalerweise funktioniert es ziemlich gut.

Einige Theorien dazu finden Sie unter Ссылка

    
Ian 11.02.2017 04:00
quelle