2017-06-08 4 views
2

Ich muss Kanten eines gerichteten Graphen mit 4 verschiedenen Etiketten beschriften, also ich es in einem N * N * 4-Array speichern. (Bleiben wir bei 4, was meine tatsächliche dritte Dimension ist.) N ist die Anzahl der Knoten im Graphen. für den Eintrag M (i, j, 1) würde ich eine Kante von Knoten i zu Knoten j mit der ersten Art von Label bezeichnen. Hier ist ein Spielzeugbeispiel zum Spielen.Wie Indizes von Nicht-Null-Elementen aus ND-Array extrahieren?

M(2,1,1)=1 anzeigt I Beschriftungstext ‚erstes Etikett‘ auf der Kante vom Knoten 2 zum Knoten 1 zeige M(3,2,2)=1 I hinzuzufügen Beschriftungstext ‚zweites Etikett‘ auf der Kante von dem Knoten 3 zu Knoten 2. Jede ‚Seite‘ in der hinzufügen 3D-Array ist eine Art von Label.

M(:,:,1)= 0 0 0  M(:,:,2)= 0 0 1   
      1 0 1    0 0 0 
      0 0 0    0 1 0 

Aber ich weiß nicht, wie N * N * 4 Array M in s und t in labeledge(h,s,t,Labels) konvertieren. s sind die Indizes der Quellknoten, während t die Indizes der Zielknoten sind.

Idealerweise ist dies die Handlung:

s = [2 2 1 3]; 
t = [1 3 3 2]; 
G = digraph(s,t); 
figure; 
h = plot(G); 

die entscheidende Frage ist, wie ich s1, t1, s2 und t2 von M wie folgt zu erreichen:

labeledge(h,[2 2], [1 3], 'first label'); 
labeledge(h,[1 3], [3 2], 'second label'); 

enter image description here FYI: M(:,:,1) und M(:,:,2) haben nicht die gleichen Nicht-Null-Einträge.

+0

Sagen Sie es 100 ist, werden Sie 100 solcher Linien 'labeledge schreiben (h, [ 2 2], [1 3], "erstes Label"); '? Was ist dein Plan dafür? –

+0

@Sardar Vielen Dank für Ihren Hinweis! Bearbeitet –

+0

Warte, möchtest du auch die Adjazenzmatrix 'adj' von' M' bekommen? –

Antwort

1

Einige Hintergrund Insight:
In Ihrem Problem, die Reihenfolge der s und t ist miteinander verknüpft das heißt Schlurfen von s keine Rolle spielt, wenn die Elemente von t auch in der gleichen Reihenfolge gemischt werden. z.B; wenn

s = [2 2 1 3]; 
t = [1 3 3 2]; 
%The combination of s and t given by you 

Der oben wird das gleiche Ergebnis wie die der folgenden geben:

s = [2 3 2 1]; 
t = [1 2 3 3]; 
% replaced column 2 with column 3, column 3 with column 2, and column 4 with column 3 

Es gibt viele solche Kombinationen. Der Code, den ich zeigen werde geben die folgende Kombination für die gegebene M:

s = [2 2 3 1]; %named as snew in my code 
t = [1 3 2 3]; %named as tnew in my code 
%In this combination, column 3 and 4 are inter-changed (See the combination given by you) 

Code:

for k=1:size(M,3)   %Looping depending on the third dimension 
    [r,c]= find(M(:,:,k)); %Finding non-zero elements 
    %Storing the values in a cell since the number of non-zero elements in each 
    %slice of M can be different 
    s{k}=r;  t{k}=c;  
end 

Der obige Code gibt s{1}=[2; 2], s{2}=[3; 1], t{1}=[1; 3] und t{2}=[2; 3] .

Jetzt können Sie s finden und t wie in Ihrer Frage gegeben kombiniert, indem sie aus dem obigen Code mit extra:

snew=vertcat(s{:}); %Giving a different name to avoid confusion 
tnew=vertcat(t{:}); 

Jetzt können Sie digraphsnew und tnew und Etikettenkanten s{2} mit s{1}, mit make , t{1} und t{2}.

Für die Kanten Beschriftung können Sie die folgende Schleife verwenden:

for k=1:length(s) 
    labeledge(h,s{k}, t{k}, ['label ',num2str(k)]); 
end 

Dadurch wird die Frage der Kennzeichnung löst, wenn es zu viele Etiketten zu machen. Das Erstellen der Etiketten als first, second, .... wäre umständlich und könnte unnötig sein.


Ausgang:
Mit den oben genannten Änderungen erhalten Sie die folgende Ausgabe:

output

+0

Ich habe nur Ihren ersten Teil der Codes verwendet, da ich bereits eine Adjazenzmatrix mit sortierten Indizes habe (d. H. [1 2 3 4 5]). d. h. ich habe 'vertcat' nicht verwendet und nur' labeledge' nach meinem ursprünglichen 'plot (G)' hinzugefügt. Ich frage mich, ob dies in Ordnung ist, da die Indizes in "Labeledge" nicht mit denen in der Adjazenzmatrix übereinstimmen. Irgendwie funktioniert Ihr Code in meinem Fall nicht und sagt: Fehler bei der Verwendung von matlab.graphics.chart.primitive.GraphPlot/labeledge s und t müssen Kanten in der Grafik angeben. –