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

Algorithmus zur Dezimierung (Douglas-Peucker)

 

Senraphil
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 16.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2014, 10:59     Titel: Algorithmus zur Dezimierung (Douglas-Peucker)
  Antworten mit Zitat      
Hallo liebe Gemeinde,

ich mache langsam Fortschritte im Verständnis und Umgang mit Matlab, doch nach meinen letzten Beiträgen mit vergleichweise einfachen Fragen, habe ich nun eine etwas härtere Nuss vor mir:
Ich möchte mit Hilfe eines Algorithmus (ich habe an den Douglas-Peucker-Algorithmus gedacht) und eines Toleranzkriteriums meinen Datensatz dezimieren, um eine Glättung des Höhenprofils zu erreichen.

Dazu wie immer ein kleines Beispiel:

Die Struktur meines Datensatzes sieht wie folgt aus:
Code:

A =

     1     2     3    75    10
     5     9     3    77     6
     1     2     3    74     1
     5     6     3    80     4
     6     5     9    75     6
     9     6     5    83     7
     6     9     8    90     2
     4     5     6    91     4
     8     5     3    92     6
     4     5     9    95     3


Die in SPALTE 4 eingetragenen Werte sind die errechneten Höhen in [m] an den jeweiligen Punkten. Daraus lässt sich selbstverständlich durch den plot-Befehl ein Höhenverlauf ausgeben. Den plot habe ich als jpg-Datei mit dem Namen "Ausgabe_Höhen_Originaldaten" angehängt.

Nun soll mit Hilfe des Algorithmus die Datenmenge reduziert werden. Als Toleranzkriterium soll dmax=2 angenommen werden. Das bedeutet, es sollen alle DatenZEILEN gelöscht werden, bei der die Höhenänderung von einem zum nächsten (oder auch zum übernächsten,...) Punkt geringer als 2 Meter ist. Am Ende soll dann der Datensatz so aussehen:
Code:
A =

     1     2     3    75    10
     5     6     3    80     4
     6     5     9    75     6
     9     6     5    83     7
     6     9     8    90     2
     4     5     9    95     3


Was nun passiert ist: ZEILE 1 muss stehen bleiben, da sich dort der Startpunkt mit Starthöhe befindet. Danach wird zunächst die ZEILE 2 gelöscht, da die Höhendifferenz von 75 auf 77 Meter innerhalb der Toleranz liegt. Der nächste Punkt (ZEILE3) liegt dann bei einer Höhe von 74 Meter. Hier ist die Höhendifferenz zum ersten Punkt (Punkt 2 wurde ja bereits gelöscht) 1 Meter, was wiederum innerhalb der Toleranz liegt und somit auch diese Zeile gelöscht werden kann. Der nächste Punkt (ZEILE 4) mit einer Höhe von 80 Metern bleibt dann bestehen, da die Höhendifferenz von 5 Metern zum 1.Punkt ausserhalb der Toleranz liegt.
Das selbe passiert mit den Höhen in den ZEILEN 7-10 der Ausgangsdaten. Es werden die ZEILEN 8 und 9 gelöscht, da dort die Änderungen in der Höhe innerhalb der Toleranz liegen. Somit bleiben die ZEILEN 7 und 10 bestehen. Die plot-Ausgabe des reduzierten Datensatzes habe ich ebenfalls mit dem Namen "Ausgabe_Höhen_reduziert" angehängt.

Die letzte ZEILE muss natürlich ebenfalls wie die 1.ZEILE des Originaldatensatzes bestehen bleiben. Dies ist aber bei der Verwendung des Douglas-Peucker-Algorithmus automatisch gegeben, wenn ich das richtig nachgelesen habe.

Kann mir jemand bei meinem Problem weiterhelfen? Ist die Verwendung des Douglas-Peucker-Algorithmus hier sinnvoll? Wenn ja, wie muss der Code dazu aussehen?

Ich hoffe ihr versteht meine Frage und könnt mir weiterhelfen.
Vielen Dank.

Gruß
Senraphil

Ausgabe_Höhen_reduziert.jpg
 Beschreibung:

Download
 Dateiname:  Ausgabe_Höhen_reduziert.jpg
 Dateigröße:  14.02 KB
 Heruntergeladen:  285 mal
Ausgabe_Höhen_Originaldaten.jpg
 Beschreibung:

Download
 Dateiname:  Ausgabe_Höhen_Originaldaten.jpg
 Dateigröße:  14.28 KB
 Heruntergeladen:  284 mal
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 24.04.2014, 11:16     Titel:
  Antworten mit Zitat      
das von dir beschriebene problem sollte sich doch recht einfach mit einer schleife lösen lassen. du hast doch schon geschrieben was gemacht werden muss ^^ das musst du jetzt nur noch in eine schleife packen Smile
so in der art:
Code:

k=1;
tol=2
while k<size(a,1)-1
if abs(a(k)-a(k+1))<tol
a(k+1)=[]
else
k=k+1;
end
end

das muss natürlich noch an dein problem angepasst werden.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Senraphil
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 16.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2014, 12:35     Titel:
  Antworten mit Zitat      
Hi Winkow,

ich habs mal probiert auf das Beispiel, was ich hier im Forum mitgepostet hab, anzuwenden. Leider kommt bei mir nicht das richtige Ergbenis raus.

Was ist in deinem Code "a"?

Ist hier die Anwendung des Douglas-Peucker-Algorithmus dann überhaupt sinnvoll?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 24.04.2014, 12:45     Titel:
  Antworten mit Zitat      
a ist zb sowas
Code:
a=[1;2;4;6;7;10];

ob der algorythmus sinnvoll ist kann ich nicht sagen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Senraphil
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 16.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2014, 13:07     Titel:
  Antworten mit Zitat      
Der Befehl funktioniert leider so nicht.

Das Ergebnis ist, dass alle Werte der Matrix in die erste Zeile der Varaible geschrieben werden und sich ansonsten nichts ändert.
Die Matrix wird von 10x5 auf 1x49 umgewandelt.

Kannst du deinen angegebenen Befehl eventuell nochmal überprüfen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 24.04.2014, 13:51     Titel:
  Antworten mit Zitat      
deswegen meinte ich ja das du den code auf dein problem abwandeln musst. hast du verstanden was der code macht ? kleiner tipp. da fehlt irgendwo ne 4 und irgendwo n : Smile
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Senraphil
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 16.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2014, 14:38     Titel:
  Antworten mit Zitat      
Die Funktionsweise des Befehls hab ich nun einigermaßen verstanden.

Allerdings erschließt sich mir nicht, wo die 4(die ja den Bezug auf die betreffende Spalte herstellen soll) und das "n" hin sollen.. Sad

Muss nicht die 4 in die Befehlszeile
Code:

if abs(a(k,4)-a(k+1,4))<tol


Ich steh grad echt aufm Schlauch Mad
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 24.04.2014, 15:11     Titel:
  Antworten mit Zitat      
das n steht für ein das wichtige kam danach ^^ der :
^^
das mit der 4 war schon richtig bei dir.
der : gehört dann in die zeile darunter da du ja die ganze zeile löschen willst.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Senraphil
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 16.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2014, 15:27     Titel:
  Antworten mit Zitat      
Endlich hat es so funktioniert wie ich es mir vorstelle!
Noch ein paar Fehlversuche und ich wäre in die Luft gegangen Smile
Danke an Winkow!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Senraphil
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 16.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2014, 13:46     Titel:
  Antworten mit Zitat      
Jetzt hab ich doch nochmal ne kleine Frage:

Was bewirkt das k=1 ??
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.04.2014, 12:34     Titel:
  Antworten mit Zitat      
Senraphil hat Folgendes geschrieben:

Was bewirkt das k=1 ??
das k mit eins initialisiert wird ^^ wenn k nicht existiert kann ich ja nicht while k<.... und k ist 1 weil ich ja beim ersten element anfangen will
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
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.