Ich habe einen Vektor, der einige Punkte im 2-D-Raum enthält. Ich möchte, dass MATLAB diese Punkte mit Linien darstellt, die von jedem Punkt zu jedem anderen Punkt gezogen werden. Im Grunde möchte ich einen Graphen, bei dem alle Punkte miteinander verbunden sind. Kann man das mit plot machen und wenn ja, wie?
Antworten
Zu viele Anzeigen?Eine Lösung besteht darin, eine Reihe von Indizes für jede Kombination von Punkten zu erstellen, indem man die Funktion MESHGRID . Sie können dann jede Linie mit der Funktion LINE (das für jede Datenspalte eine Zeile ausgibt):
N = 10; %# Number of points
x = rand(1,N); %# A set of random x values
y = rand(1,N); %# A set of random y values
[I,J] = meshgrid(1:N); %# Create all the combinations of indices
index = [I(:) J(:)].'; %'# Reshape the indices
line(x(index),y(index),'Color','k'); %# Plot the lines
hold on
plot(x,y,'r*'); %# Plot the points
EDIT :
Sie werden feststellen, dass die obige Lösung eine Linie für jede Verbindung, d. h. es werden Linien der Länge Null gezeichnet, die Punkte mit sich selbst verbinden, und es werden 2 Linien für jede Verbindung gezeichnet (d. h. von Punkt A nach Punkt B et von Punkt B nach Punkt A). Hier ist eine andere Lösung (mit den Funktionen HANKEL y FINDEN SIE ), die redundante oder unnötige Zeilen nicht aufzeichnen:
N = 10; %# Number of points
x = rand(1,N); %# A set of random x values
y = rand(1,N); %# A set of random y values
[r,c,v] = find(hankel(2:N)); %# Create unique combinations of indices
index = [v c].'; %'# Reshape the indices
line(x(index),y(index),'Color','k'); %# Plot the lines
hold on
plot(x,y,'r*'); %# Plot the points
Beide oben genannten Lösungen erzeugen visuell identische Diagramme:
Eine Anmerkung zum Timing...
Aus reiner Neugierde dachte ich, ich würde meine Zeit HANKEL Lösung und vergleichen Sie sie mit Amro's sehr prägnant NCHOOSEK Lösung. Für N = 10
gab es keinen nennenswerten Unterschied. Als ich jedoch die N
auf viel größere Werte, begann ich zu sehen, dass die NCHOOSEK-Lösung anfing, zu よほど langsam:
-
N = 200
>> tic; [r,c,v] = find(hankel(2:N)); index = [v c].'; toc; %' Elapsed time is 0.009747 seconds. >> tic; pairs = nchoosek(1:N,2).'; toc; %' Elapsed time is 0.063982 seconds.
-
N = 1000
>> tic; [r,c,v] = find(hankel(2:N)); index = [v c].'; toc; %' Elapsed time is 0.175601 seconds. >> tic; pairs = nchoosek(1:N,2).'; toc; %' Elapsed time is 12.523955 seconds.
Ich war etwas überrascht, bis ich mir den Code für NCHOOSEK ansah (durch Eingabe von type nchoosek
im MATLAB-Befehlsfenster). Eine Variable wird nicht nur innerhalb einer Schleife erzeugt, sondern auch Vorab zugewiesene (wie Amro in einem Kommentar bemerkte), aber der verwendete Algorithmus ist auch rekursiv was bedeutet, dass viele Funktionsaufrufe gemacht werden. Mir ist auch diese Zeile am Ende des Hilfetextes für NCHOOSEK aufgefallen:
Diese Syntax ist nur in Situationen sinnvoll, in denen N weniger als etwa 15 beträgt.
Aufbauend auf gnovice Eine einfachere und intuitivere Methode zur Erzeugung aller Paare ist die Verwendung der nchoosek Funktion:
%# random points
N = 10;
x = rand(1,N);
y = rand(1,N);
%# all possible combinations of the elements of [1:N] taken 2 at a time
pairs = nchoosek(1:N, 2)';
%'# plot points and lines
plot(x(pairs), y(pairs), '-bs', 'MarkerFaceColor','g', 'MarkerSize',10)