Erstellen Sie eine Adjazenzmatrix in MATLAB
Betrachten eine Reihe von Punkten angeordnet, die auf einem raster der Größe N-M.
Ich bin versucht zu bauen, die Nähe matrix, so dass
benachbarte Punkte miteinander verbunden sind.
Beispielsweise in einem 3x3-raster mit einem Diagramm:
1-2-3
| | |
4-5-6
| | |
7-8-9
Sollten wir die entsprechende Nachbarschaft-matrix:
+---+------------------------------------------------------+
| | 1 2 3 4 5 6 7 8 9 |
+---+------------------------------------------------------+
| 1 | 0 1 0 1 0 0 0 0 0 |
| 2 | 1 0 1 0 1 0 0 0 0 |
| 3 | 0 1 0 0 0 1 0 0 0 |
| 4 | 1 0 0 0 1 0 1 0 0 |
| 5 | 0 1 0 1 0 1 0 1 0 |
| 6 | 0 0 1 0 1 0 0 0 1 |
| 7 | 0 0 0 1 0 0 0 1 0 |
| 8 | 0 0 0 0 1 0 1 0 1 |
| 9 | 0 0 0 0 0 1 0 1 0 |
+---+------------------------------------------------------+
Als bonus, sollte die Lösung funktionieren sowohl für 4 - und 8-verbunden sind die benachbarten Punkte, das ist:
o o o o
o X o vs. o X o
o o o o
Dieser den code, den ich bisher:
N = 3; M = 3;
adj = zeros(N*M);
for i=1:N
for j=1:M
k = sub2ind([N M],i,j);
if i>1
ii=i-1; jj=j;
adj(k,sub2ind([N M],ii,jj)) = 1;
end
if i<N
ii=i+1; jj=j;
adj(k,sub2ind([N M],ii,jj)) = 1;
end
if j>1
ii=i; jj=j-1;
adj(k,sub2ind([N M],ii,jj)) = 1;
end
if j<M
ii=i; jj=j+1;
adj(k,sub2ind([N M],ii,jj)) = 1;
end
end
end
Wie kann dieser verbessert werden, um zu vermeiden, all die Schleife?
Kommentar zu dem Problem
Nein, das ist keine Hausaufgabe. Mein Ziel ist es Plotten Sie diese Punkte und Linien zeichnen zwischen verbundenen Punkte als graph. Das interessante an der Sache ist, dass diese Punkte nicht zu bleiben, die sich auf dem grid..
InformationsquelleAutor der Frage Dave | 2010-07-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie bemerken,, es ist ein deutliches Muster der Nähe-Matrizen, die Sie erstellen. Insbesondere sind symmetrische und gebändert. Sie können diese Tatsache nutzen, um einfach erstellen Sie Ihre Matrizen mit der DIAG Funktion (oder die SPDIAGS Funktion, wenn Sie möchten, um eine sparse matrix). Hier ist, wie können Sie erstellen, die Nähe matrix für jeden Fall, mit Ihrer Probe die matrix oben als Beispiel:
4-angeschlossen Nachbarn
, Und Sie erhalten die folgende matrix:
8-angeschlossen Nachbarn
, Und Sie erhalten die folgende matrix:
InformationsquelleAutor der Antwort gnovice
Nur zum Spaß, hier ist eine Lösung zu konstruieren, die Nachbarschaft-matrix durch Berechnung der Distanz zwischen allen Paaren von Punkten auf dem Gitter (nicht der effizienteste Weg, natürlich)
Und hier sind einige code-Visualisierung der Nachbarschaft-matrix und der graph der verbundenen Punkte:
InformationsquelleAutor der Antwort Amro
Ich habe gerade diese Frage bei der Suche nach dem gleichen problem. Jedoch, keine der Lösungen funktionierte für mich, weil das problem der Größe, die erforderlich, die Verwendung von sparse-matrix-Typen. Hier ist meine Lösung, die funktioniert auf großen Instanzen:
InformationsquelleAutor der Antwort mnmltype
Ihrer aktuellen code scheint nicht so schlimm. Die eine oder andere Weise müssen Sie die Iteration über alle Nachbarn Paaren. Wenn Sie wirklich brauchen, um den code optimieren, würde ich vorschlagen:
1 <= i <= (N*M)
[i-M, i+1, i+M, i-1]
im UhrzeigersinnBemerken, dass man alle Nachbarn Paaren von Knoten:
i % M != 0
(seit Matlab ist nicht 0-basiert sondern 1-basiert)i > M
Dies würde leed zu einem single-loop - (aber gleiche Anzahl von N*M Iterationen), wird aufrufen nicht sub2ind(), und hat nur zwei if-Anweisungen in der Schleife.
InformationsquelleAutor der Antwort catchmeifyoutry
Kam gerade über diese Frage. Ich habe eine schöne Arbeit m-Funktion (link:
sparse_adj_matrix.m
), dass ganz allgemein.Es kann mit 4-connect-raster (radius 1 nach L1-norm), 8-connect-raster (radius 1 nach L_infty norm).
Es können auch 3D Unterstützung (und beliebig höher domensional grids).
Die Funktion kann auch die Verbindung von Knoten weiter als radius = 1.
Hier ist die Signatur der Funktion:
InformationsquelleAutor der Antwort Shai
Für jeden Knoten in dem Graphen hinzu kommt eine Verbindung nach rechts und eine nach unten. Überprüfen Sie, dass Sie nicht überfordert mit Ihrem grid. Betrachten Sie die folgende Funktion baut, dass die Nachbarschaft-matrix.
Beispiel wie oben
AdjMatrixLattice4(3,3)=
InformationsquelleAutor der Antwort ja72