WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Linie plotten: Koordinaten sortieren aber wonach/wie?

 

MatthiasHermann

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2016, 20:51     Titel: Linie plotten: Koordinaten sortieren aber wonach/wie?
  Antworten mit Zitat      
Hallo Leute,

ich stehe gerade vor einem (kleinen?) Problem. Und zwar habe ich mir eine Datenpunktwolke generiert, welche die x- und y-Koordinate einer Linie enthält.

Ansich ist das nun kein Problem, auf dieser Grundlage eine Linie zu plotten.

Das Problem bei der Sache ist nun, dass meine Datenpunkte unsortiert sind, und ich habe keine Ahnung wie ich diese am Vernünftigsten sortieren kann, um die Linie plotten zu können. - Ich habe nun schon einiges mit sortrows() versucht, aber bin letztlich nie auf einen grünen Zweig gekommen, da meine Vorstellungskraft endenwollend ist, was das/die Sortierkriterium/-en angeht, da meine Linie ziemlich gekrümmt ist und somit manche x- bzw. y-Koordinaten doppelt vorkommen ...

Das ist das Daten-Array (im Anhang findet ihr die Punkte - ohne Verbindungslinie - geplottet):

Code:

testa =

         0   -0.7540
         0   -7.1057
    1.5000   -0.7469
    1.5000   -7.1204
    1.8800   -0.8371
    1.8800   -7.0870
    2.2500   -1.3461
    2.2500   -6.8572
    1.7616   -0.8000
    2.0413   -1.0000
    2.1894   -1.2000
    2.2778   -1.5000
    2.2978   -1.8000
    2.3008   -2.0000
    2.3031   -2.2000
    2.3047   -2.5000
    2.3045   -2.8000
    2.3035   -3.0000
    2.3042   -3.2000
    2.3075   -3.5000
    2.3108   -3.8000
    2.3123   -4.0000
    2.3150   -4.2000
    2.3201   -4.5000
    2.3256   -4.8000
    2.3295   -5.0000
    2.3334   -5.2000
    2.3422   -5.5000
    2.3502   -5.8000
    2.3547   -6.0000
    2.3555   -6.2000
    2.3402   -6.5000
    2.2778   -6.8000
    2.0745   -7.0000
 


... aber wie ordnet man das nun so um, damit letzlich diese Datenpunkte einfach durch eine Linie verbunden werden. (Und nicht wild "herumzackeln", wie es momentan der Fall wäre, wenn ich die Punkte direkt so plotten würde ...)

Vielleicht kann mir jemand von Euch helfen.
Danke jedenfalls schon im Voraus dafür,

MatthiasH

Punkte.PNG
 Beschreibung:

Download
 Dateiname:  Punkte.PNG
 Dateigröße:  8.04 KB
 Heruntergeladen:  394 mal
Punkte.PNG
 Beschreibung:
Datenpunkte (ohne Verbindungslinie)

Download
 Dateiname:  Punkte.PNG
 Dateigröße:  8.04 KB
 Heruntergeladen:  323 mal


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.11.2016, 21:49     Titel:
  Antworten mit Zitat      
Hallo,

du könntest z.B. die Kurve in eine untere und eine obere unterteilen, z.B. bei median(y). Alles <= median(y) gehört zur unteren Kurve, alles >= median(y) zur oberen.

Dann die beiden Kurven nacheinander in der gleichen Farbe plotten.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatthiasHermann

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2016, 22:01     Titel:
  Antworten mit Zitat      
Hallo Harald,

Zitat:
du könntest z.B. die Kurve in eine untere und eine obere unterteilen, z.B. bei median(y). Alles <= median(y) gehört zur unteren Kurve, alles >= median(y) zur oberen.


Hmm. Diese Idee hatte ich auch schon; allerdings bin ich dann an der Umsetzung gescheitert: selbst wenn ich ein Kriterium für den unteren/oberen Kurventeil festlege, bleiben die Punkte danach trotzdem noch "unsortiert", oder verstehe ich das falsch?

Ich hatte in diese Richtung gedacht:

Code:

unterer_teil = [];
oberer_teil = [];

for ii=1:size(testa,1)
  if testa(ii,ii) <= median(testa)
    unterer_teil = [ unterer_teil; testa(ii,ii) ];
  end

  if testa(ii,ii) >= median(testa)
    oberer_teil = [ oberer_teil; testa(ii,ii) ];
  end
end
 


... aber irgendwie klappt das nicht so, ganz wie ich mir das vorstelle :/

mlg,
MatthiasH
 
MatthiasHermann

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2016, 22:08     Titel:
  Antworten mit Zitat      
... aah, da war ich zu schnell beim Code-Posten; so wie er dort steht, kann er nicht funktionieren.

Allerdings habe ich immer das Problem mit den doppelten Koordinaten ... mal sehen.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.11.2016, 22:16     Titel:
  Antworten mit Zitat      
Hallo,

du solltest schon die kompletten Zeilen der oberen oder unteren Kurve zuordnen, basierend auf der y-Spalte (die 2.?).
Dann die beiden Kurventeile sortieren und plotten.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatthiasHermann

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2016, 22:22     Titel:
  Antworten mit Zitat      
Hallo Harald,

jetzt hab' ich mich etwas selbst verwirrt - ich muss in y/z (= x/y von vorher) Koordinaten denken. - D.h. nach der z-Koordinate zuordnen.

Ich habe nun den Code nochmals adaptiert und eigentlich funktioniert es ganz gut, allerdings fehlen mir ein paar Daten nun in der Darstellung ...

Code:

 unterer_teil = [];
oberer_teil = [];
median_yz = median(testa);
for ii=1:size(testa,1)
 
    if (testa(ii,1)<=median_yz(1)) && (testa(ii,2)>=median_yz(2))
       unterer_teil = [unterer_teil; ...
           testa(ii,1), testa(ii,2)];
    end
   
    if (testa(ii,1)>=median_yz(1)) && (testa(ii,2)<=median_yz(2))
       oberer_teil = [oberer_teil; ...
           testa(ii,1), testa(ii,2)];
    end
   
   
end
 


(es kann auch gelegentlich vorkommen, dass manche Punkte dieselbe z-Koordinate haben, jenachdem wie "flach" dieses "Zwetschgoid" wird ... - Das ist das, was mir ursächlich die Kopfzerbrechen bereitet hat ...)
 
MatthiasHermann

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2016, 22:29     Titel:
  Antworten mit Zitat      
So ...

nochmal :/ ... - also mit dem Code wie ich ihn nun habe, funktionierts ganz gut, allerdings tanzen (vor- und nach der Sortierung) immer ca. 2 Punkte "aus der Reihe" ... - wenn ich die noch irgendwie einordnen könnte. Ach. Das wär' super.

Code:

unterer_teil = [];
oberer_teil = [];
median_yz = median(testa);
for ii=1:size(testa,1)
 
    if (testa(ii,2)<=median_yz(2))
       unterer_teil = [unterer_teil; ...
           testa(ii,1), testa(ii,2)];
    end
   
    if (testa(ii,2)>=median_yz(2))
       oberer_teil = [oberer_teil; ...
           testa(ii,1), testa(ii,2)];
    end
   
   
end

% ... sortieren bringt nicht den gewünschten Effekt ...
sortu = sortrows(unterer_teil,2);
sorto = sortrows(oberer_teil,2);
 


mlg
MatthiasH
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.11.2016, 11:01     Titel:
  Antworten mit Zitat      
Hallo MatthiasHermann,

Ist es gewollt, dass der Fall testa(ii,2)==median_yz(2) in beide Teile einsortiert wird?

Hier ein vereinfachter Code:
Code:
median_yz = median(testa(:, 2));
unterer_teil = testa((testa(:, 2) >= media_yz), :);
oberer_teil = testa((testa(:, 2) <= media_yz), :);

sortu = sortrows(unterer_teil, 2);
sorto = sortrows(oberer_teil, 2);

Nun müsstest Du noch erklären, von welchen "immer ca. 2 Punkten" Du meinst, dass sie "aus der Reihe tanzen". Bisher sehen wir nur den Code, der ganz genau das machjt, was man erwartet. Was möchtest Du nun anders haben?

Was bedeutet genau "herumzackeln"? Suchst Du vielleicht für jeden Punkt den nächsten Nachbarn?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.11.2016, 17:30     Titel:
  Antworten mit Zitat      
Hallo,

dann müsste man wahrscheinlich noch einen mittleren Teil extrahieren, und den nach y-Koordinaten sortieren.

Es dürfte aber einfacher sein, wie von Jan angesprochen den jeweils nächstgelegenen Punkt zu suchen und den vorherigen Punkt dann aus dem Datenset zu entfernen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatthiasHermann

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2016, 18:39     Titel:
  Antworten mit Zitat      
Hallo,

ich war leider krank, deshalb konnte ich zwischenzeitlich nichts schreiben.

Zitat:
Es dürfte aber einfacher sein, wie von Jan angesprochen den jeweils nächstgelegenen Punkt zu suchen und den vorherigen Punkt dann aus dem Datenset zu entfernen.


Das stimmt. Das ist es eigentlich, was ich machen möchte, also den jeweils nächsten Nachbarn finden, um die Punkte so ordnen zu können, dass man einfach eine Linie Plotten kann.

Mit "zackeln", meinte ich, dass sich aus meinem Code leider eine falsche Sortierung ergibt, z.B. wenn folgende Daten sortiert werden müssen (1 spalte = y; 2-spalte = z; Rechtssystem, z nach unten positiv):

Code:

0   -2,52843046731875
0   -7,03609190647058
2,50000000000000   -1,12404451520314
2,50000000000000   -7,17958452455575
3,12000000000000   -0,825033851205055
3,12000000000000   -7,07583270635671
3,75000000000000   -1,06060310078619
3,75000000000000   -6,83746484518627
4,10000000000000   -2,35788583288942
4,10000000000000   -5,99014022674160
2,66132526961723   -1
3,59588476695570   -1
2,43319241043947   -1,20000000000000
3,80497312782003   -1,20000000000000
2,05816795647234   -1,50000000000000
3,87281441366349   -1,50000000000000
1,26416929902928   -1,80000000000000
3,96619312421721   -1,80000000000000
0,772890147204374   -2
4,03872753254569   -2
0,452972577720576   -2,20000000000000
4,07799298541178   -2,20000000000000
0,0453518468297966   -2,50000000000000
4,11834846385454   -2,50000000000000
4,15021849512029   -2,80000000000000
4,17238430788022   -3
4,17032620693813   -3,20000000000000
4,19151394907075   -3,50000000000000
4,18482041718049   -3,80000000000000
4,20444837808657   -4
4,19081019683871   -4,20000000000000
4,20972860433398   -4,50000000000000
4,20121862072873   -4,80000000000000
4,19124175764135   -5
4,18426614080440   -5,20000000000000
4,18843814064558   -5,50000000000000
4,13922970403733   -5,80000000000000
4,09765111878265   -6
4,04505403646707   -6,20000000000000
3,93743335846512   -6,50000000000000
3,78846279740107   -6,80000000000000
3,32278785245395   -7
 


... meinen Code habe ich zwischenzeitlich auf folgendes adaptiert:

Code:

% Zeroline-Rohdaten sortieren
arr_zeroline_part_u = [];
arr_zeroline_part_o = [];

median_yz = median(arr_zeroline);
for ii=1:size(arr_zeroline,1)
 
    if (arr_zeroline(ii,2)<=median_yz(2))
       arr_zeroline_part_o = [arr_zeroline_part_o; ...
           arr_zeroline(ii,1), arr_zeroline(ii,2)];
    end
   
    if (arr_zeroline(ii,2)>=median_yz(2))
       arr_zeroline_part_u = [arr_zeroline_part_u; ...
           arr_zeroline(ii,1), arr_zeroline(ii,2)];
    end    
   
end

arr_sort_u_part = sortrows(arr_zeroline_part_u(2:end, :),2);
arr_sort_u_subpart = flipud(sortrows(arr_sort_u_part(end-4:end, :),1)); %-4
arr_sort_u_part(end-4:end, :) = arr_sort_u_subpart;                     %-4
arr_sort_u = [ arr_zeroline_part_u(1,1), arr_zeroline_part_u(1,2) ];
arr_sort_u = [ arr_sort_u; flipud(arr_sort_u_part) ];

arr_sort_o_part = sortrows(arr_zeroline_part_o(2:end, :),2);
arr_sort_o_subpart = sortrows(arr_sort_o_part(1:5, :),1);
arr_sort_o_part(1:5, :) = arr_sort_o_subpart;
arr_sort_o = [ arr_zeroline_part_o(1,1), arr_zeroline_part_o(1,2) ];
arr_sort_o = [ arr_sort_o; arr_sort_o_part ];

arr_zeroline = [ arr_sort_u(1:end,:);
                 flipud(arr_sort_o) ];
 


... aber das deckt leider nicht alle Fälle ab, die ich für arr_zeroline() erhalte bzw. führt zu folgendem Ergebnis:

Code:

0   -2,52843046731875
2,50000000000000   -1,12404451520314
2,66132526961723   -1
3,12000000000000   -0,825033851205055
3,59588476695570   -1
3,75000000000000   -1,06060310078619
3,80497312782003   -1,20000000000000
2,43319241043947   -1,20000000000000
3,87281441366349   -1,50000000000000
2,05816795647234   -1,50000000000000
3,96619312421721   -1,80000000000000
1,26416929902928   -1,80000000000000
4,03872753254569   -2
0,772890147204374   -2
4,07799298541178   -2,20000000000000
0,452972577720576   -2,20000000000000
4,10000000000000   -2,35788583288942
4,11834846385454   -2,50000000000000
0,0453518468297966   -2,50000000000000
4,15021849512029   -2,80000000000000
4,17238430788022   -3
4,17032620693813   -3,20000000000000
4,19151394907075   -3,50000000000000
4,18482041718049   -3,80000000000000
4,20444837808657   -4
4,19081019683871   -4,20000000000000
4,20972860433398   -4,50000000000000
4,20121862072873   -4,80000000000000
4,19124175764135   -5
4,18426614080440   -5,20000000000000
4,18843814064558   -5,50000000000000
4,13922970403733   -5,80000000000000
4,10000000000000   -5,99014022674160
4,09765111878265   -6
4,04505403646707   -6,20000000000000
3,93743335846512   -6,50000000000000
3,78846279740107   -6,80000000000000
3,75000000000000   -6,83746484518627
3,32278785245395   -7
3,12000000000000   -7,07583270635671
2,50000000000000   -7,17958452455575
0   -7,03609190647058
 


... das sich so darstellt:


Selbst wenn das Ding zur Mitte hin immer "zerquetschter" aussieht, sollte es zumindest annähernd eine elipsoide Form behalten ...

- Vielleicht kann mir jemand von euch helfen, bzw. danke schon bisher für eure Hilfe, das hat schon viel geholfen!

mlg,
MatthiasH

gezackel.png
 Beschreibung:

Download
 Dateiname:  gezackel.png
 Dateigröße:  14.71 KB
 Heruntergeladen:  326 mal
 
MatthiasHermann

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2016, 18:40     Titel:
  Antworten mit Zitat      
... das ursprüngliche Datenarray heißt im obigen Beispiel nicht mehr "testa", sondern "arr_zeroline".

Smile
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.11.2016, 19:16     Titel:
  Antworten mit Zitat      
Hallo MatthiasHermann,

Ich verstehe nach wie vor nicht, was du versuchst. Wozu könnte hier denn der Median nützlich sein und sortrows sortiert doch die Reihen nach der ersten Koordinate, was mit Deinem Problem ja nichts zu tun hat.

Die geposteten Daten sind wegen der Kommas nicht verwendbar. Die Absicht Deines Codes kann ich nicht nachvollziehen.

Zitat:
Zitat:
Es dürfte aber einfacher sein, wie von Jan angesprochen den jeweils nächstgelegenen Punkt zu suchen und den vorherigen Punkt dann aus dem Datenset zu entfernen.


Das stimmt. Das ist es eigentlich, was ich machen möchte, also den jeweils nächsten Nachbarn finden, um die Punkte so ordnen zu können, dass man einfach eine Linie Plotten kann.

Ich kann in Deinem Code nichts finden, bei dem Du den Abstand zwischen den Punkten berücksichtigst.

Es gibt bestimmt im Internet veröffentlichten Code zur Bestimmung eines Polygones zu einer Punkt-Wolke. Der Code ist aber auch nicht schwierig zu schreiben: Nimm einen Start-Punkt, berechne die Entfernung zu allen anderen Punkten, wähle den nächsten und mache mit diesem weiter.

Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
MatthiasHermann

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2016, 19:33     Titel:
  Antworten mit Zitat      
Hallo Jan S,

Zitat:
Ich verstehe nach wie vor nicht, was du versuchst. Wozu könnte hier denn der Median nützlich sein und sortrows sortiert doch die Reihen nach der ersten Koordinate, was mit Deinem Problem ja nichts zu tun hat.


Hm. Eigentlich geht es mir nur darum, dass ich die Datenpunkten, wie ich sie hier schnell im Excel geplottet habe, so sortieren kann, damit sie ein Polygon beschreiben.


Das "median" etc. hatte ich verwendet, da der erste Vorschlag von Harald kam, dass ich die Kurve in einen oberen und unteren Teil splitten könnte etc. ... - aber ich habe mich anscheinend sehr unverständlich ausgedrückt, da ich selber nicht genau wusste, wie ich das Problem beschreiben kann.

Nun denke ich ich kann es: Es geht darum, eine Punktwolke, wie sie vorliegt, so zu sortieren, dass man diese als Polygon darstellen kann.

- Das geht am Einfachsten mit deinem Vorschlag: ich starte z.B. am Punkt links unten und berechne mir jeden Abstand. etc. ...
Ich programmier das mal aus und poste dann den Code. Vielleicht ist er ja für irgendjemand anderem später einmal von Nutzen.

LG,
MatthiasHermann

polygon.PNG
 Beschreibung:

Download
 Dateiname:  polygon.PNG
 Dateigröße:  10.3 KB
 Heruntergeladen:  339 mal
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.