8 Stimmen

Wie kann ich Linien zwischen allen Punkten eines Vektors zeichnen?

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?

8voto

gnovice Punkte 124264

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:

alt text

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.

8voto

Amro Punkte 122495

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)

screenshot

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X