2017-04-01 3 views
2

Ich möchte L = laplacian(G) aus einer Grafik dataset berechnen. Ich importiert den Datensatz, die zwei Spalten enthält: FromNodeId und ToNodeId:Fehler beim Ausführen von G = Grafik (s, t) in Matlab

# Nodes: 3997962 Edges: 34681189 
# FromNodeId ToNodeId 
0 1 
0 2 
0 31 
0 73 
0 80 
0 113619 
0 2468556 
0 2823829 
0 2823833 
0 2846857 
0 2947898 
0 3011654 
0 3701688 
0 3849377 
0 4036524 
0 4036525 
0 4036527 
0 4036529 
0 4036531 
0 4036533 
0 4036534 
0 4036536 
0 4036537 
1 2 
1 3 
1 4 
1 5 
1 6 
1 7 
1 8 
1 9 
1 10 
1 11 

Um dies zu tun, ich brauche zu finden G zuerst so verwende ich G = graph(FromNodeId, FromNodeId). Als ich das tat, habe ich diesen Fehler:

>> G = graph(fromNodeId,toNodeId) 
Error using matlab.internal.graph.MLGraph 
Source must be a dense double array of node indices. 

Error in matlab.internal.graph.constructFromEdgeList (line 125) 
G = underlyingCtor(double(s), double(t), totalNodes); 

Error in graph (line 264) 
       matlab.internal.graph.constructFromEdgeList(... 

Ich weiß nicht, warum! Kann ich eine Lösung dafür finden? Vielen Dank.

+1

Sind sowohl fromNodeID als auch toNodeID volle doppelte Arrays? Versuchen Sie 'FromNodeID = full (double (FromNodeID)); ToNodeID = voll (double (ToNodeID)); '. "Quelle muss eine dichte doppelte Anordnung von Knotenindizes sein." klingt für mich so, als würden Sie entweder ein Sparse-Array oder einen einzelnen Typ eingeben. – Poelie

+1

Das Problem besteht darin, wie die Daten protokolliert werden. Die Arrays sind spärlich, das habe ich überprüft. – NKN

+0

Mögliches Duplikat von [Ziel muss ein dichtes doppeltes Array von Knotenindizes sein. Wie zu lösen?] (Http://stackoverflow.com/questions/35075759/target-must-be-a-dense-double-array-of-node-indices-how-to-solve) – Poelie

Antwort

1

Das Problem liegt darin, dass keine Nullen zulässig sind, wenn die Graph-Funktion auf diese Weise verwendet wird. (Siehe: Target must be a dense double array of node indices. How to Solve?)

Ich habe den Datensatz heruntergeladen und führte ihn erfolgreich mit dem folgenden Code. Beachten Sie, dass dieser Code einen Systembefehl verwendet und nicht mit allen Betriebssystemen kompatibel ist. Er sollte jedoch so einfach sein, dass er für jedes Betriebssystem, das Sie verwenden, neu geschrieben werden kann. Außerdem wird davon ausgegangen, dass sich die TXT-Datei im Arbeitsverzeichnis befindet.

% Removes first lines with comments in them; this system command was tested on Linux Ubuntu 14.04 and is probably not portable to Windows. 
% If this system command doesn't work, manually remove the first four lines from the text file. 
system('tail -n +5 com-lj.ungraph.txt > delimitedFile.txt'); 
% Read the newly created delimited file and add 1 to all nodes. 
edges=dlmread('delimitedFile.txt')+1; 
% Build the graph 
G=graph(edges(:,1),edges(:,2)); 

Sie Angenommen, haben Sie Ihre Arrays bauen ähnlich wie ich es tat, Zugabe von 1 bis FromNodeIdFull und ToNodeIdFull sollte Ihr Problem lösen. Mit anderen Worten, das folgende Code-Snippet sollte Ihr Problem lösen. Wenn das nicht der Fall ist, empfehle ich Ihnen, den oben beschriebenen Code neu zu schreiben.

G=graph(FromNodeIdFull+1,ToNodeIdFull+1); 

Weggehen meine alte Antwort hier, wie es zu löschen Verwirrung für andere verursachen kann sowohl diese Antwort und die Kommentare zu lesen. Beachten Sie, dass die Antwort unten das Problem nicht gelöst hat.

setzen Sie einfach die Kommentare von mir und NKN in eine Antwort:

Das Problem liegt in der Tatsache, dass die Arrays sind spärlich, aber graph() scheint voll Arrays zu erwarten. Folgendes sollte funktionieren:

FromNodeIdFull=full(double(FromNodeId)); 
ToNodeIdFull=full(double(ToNodeId)); 
G=graph(FromNodeIdFull,ToNodeIdFull); 

Je nachdem, ob Sie Ihre Eingabe-Arrays sind bereits verdoppelt oder nicht können Sie in der Lage sein, die double() aus den ersten beiden Zeilen zu entfernen.

+0

Vielen Dank für deine Antwort. Ich habe deine Lösung benutzt, aber ich bekomme immer noch den gleichen Fehler !! Ich weiß nicht, was mit diesem Datensatz falsch ist !! Es macht mich verzweifelt – Kris

+0

Bitte akzeptieren Sie keine Antworten, die Ihr Problem nicht gelöst haben; Dies kann dazu führen, dass andere Ihre Frage übersehen. – Poelie

+0

Eine aktualisierte Antwort hinzugefügt. – Poelie

Verwandte Themen