In den Folien wird ein Algorithmus zur Komprimierung von Rohdaten für Liniendiagramme in TikZ und pgfplots (LaTeX) anhand eines einfachen Beispiels erklärt. Der zugehörige MATLAB-Quelltext ist ebenfalls angefügt.
Erfahrungen mit einem Online-Zulassungstest mit numerischen und MC-basierten ...
Komprimierung von Rohdaten für Liniendiagramme in TikZ und pgfplots
1. Komprimierung von Rohdaten für
Liniendiagramme in TikZ und pgfplots
Mathias Magdowski
Lehrstuhl für Elektromagnetische Verträglichkeit
Institut für Medizintechnik
Otto-von-Guericke-Universität, Magdeburg
16. Januar 2014
Lizenz: cba CC BY-SA 3.0 (Namensnennung, Weitergabe unter gleichen Bedingungen)
1
3. Warum sollte man Diagramme in TikZ erstellen?
Vorteile:
Trennung von Inhalt und Form
einheitliches Aussehen (Schriftart, Linienstile, Stichstärke,
Farbeinstellungen, . . . )
Nachteile:
Einarbeitungszeit
zeitaufwendige Kompilierung −→ external-Bibliothek
Speicherüberschreitung −→ Kompression der Rohdaten (oder
LuaTEX)
3
4. Komprimierung von Rohdaten
Idee:
nur eine begrenzte Anzahl von Punkten vom Auge auflösbar
nur die relevanten Punkte speichern
irrelevante Punkte nicht plotten
feste Anzahl N von relevanten Punkten einstellbar
Umsetzung:
Algorithmus in MATLAB
Eingabedaten: Rohdaten (x, y), Anzahl N, Modus
Ausgabedaten: komprimierte Rohdaten (x, y)
4
5. Algorithmus
Anfang:
ersten und letzten Wert übernehmen
Schleife von n = 3 bis N:
Interpolieren mit n − 1 Punkten (mit interp1-Funktion)
Wert mit der größten Abweichung suchen und übernehmen
Modus plot, semilogx, semilogy und loglog:
entsprechende Logarithmierung am Anfang
Delogarithmierung am Ende
5
7. Beispielhaftes Ergebnis mit N = 3 Punkten
0 100 200 300 400 500 600 700 800 900
−30
−20
−10
0
10
Zeit in s
magnetischeFlussdichteinnT
unkomprimiert
komprimiert
7
8. Beispielhaftes Ergebnis mit N = 4 Punkten
0 100 200 300 400 500 600 700 800 900
−30
−20
−10
0
10
Zeit in s
magnetischeFlussdichteinnT
unkomprimiert
komprimiert
8
9. Beispielhaftes Ergebnis mit N = 5 Punkten
0 100 200 300 400 500 600 700 800 900
−30
−20
−10
0
10
Zeit in s
magnetischeFlussdichteinnT
unkomprimiert
komprimiert
9
10. Beispielhaftes Ergebnis mit N = 10 Punkten
0 100 200 300 400 500 600 700 800 900
−30
−20
−10
0
10
Zeit in s
magnetischeFlussdichteinnT
unkomprimiert
komprimiert
10
11. Beispielhaftes Ergebnis mit N = 20 Punkten
0 100 200 300 400 500 600 700 800 900
−30
−20
−10
0
10
Zeit in s
magnetischeFlussdichteinnT
unkomprimiert
komprimiert
11
12. Beispielhaftes Ergebnis mit N = 50 Punkten
0 100 200 300 400 500 600 700 800 900
−30
−20
−10
0
10
Zeit in s
magnetischeFlussdichteinnT
unkomprimiert
komprimiert
12
13. Beispielhaftes Ergebnis mit N = 100 Punkten
0 100 200 300 400 500 600 700 800 900
−30
−20
−10
0
10
Zeit in s
magnetischeFlussdichteinnT
unkomprimiert
komprimiert
13
14. Beispielhaftes Ergebnis mit N = 200 Punkten
0 100 200 300 400 500 600 700 800 900
−30
−20
−10
0
10
Zeit in s
magnetischeFlussdichteinnT
unkomprimiert
komprimiert
14
15. Beispielhaftes Ergebnis mit N = 500 Punkten
0 100 200 300 400 500 600 700 800 900
−30
−20
−10
0
10
Zeit in s
magnetischeFlussdichteinnT
unkomprimiert
komprimiert
15
16. Beispielhaftes Ergebnis mit N = 1000 Punkten
0 100 200 300 400 500 600 700 800 900
−30
−20
−10
0
10
Zeit in s
magnetischeFlussdichteinnT
unkomprimiert
komprimiert
16
17. Beispielhaftes Ergebnis mit N = 2000 Punkten
0 100 200 300 400 500 600 700 800 900
−30
−20
−10
0
10
Zeit in s
magnetischeFlussdichteinnT
unkomprimiert
komprimiert
17
18. Zusammenfassung
Ergebnis:
einfacher Algorithmus, auch in anderen numerischen
Rechenumgebungen implementierbar
schnelleres Kompilieren, kleinere Ergebnisdatei
für „glatte“ und „verrauschte“ Verläufe anwendbar
aber Rechenzeit für das Komprimieren
Ausblick:
andere Algorithmen für „glatte“ Verläufe denkbar
Informationsgehalt/Entropie erkennbar
18
20. MATLAB-Quelltext
f u n c t i o n csv_data_comp=compress_csv_data2 ( csv_data ,N, modus )
% Modus überprüfen
i f strcmp ( modus , ’ semilogx ’ )
csv_data (: ,1)= log ( csv_data ( : , 1 ) ) ;
e l s e i f strcmp ( modus , ’ semilogy ’ )
csv_data ( : , 2 : end)= log ( csv_data ( : , 2 : end ) ) ;
e l s e i f strcmp ( modus , ’ l o g l o g ’ )
csv_data=log ( csv_data ) ;
end
% e r s t e n und l e t z t e n Wert übernehmen
csv_data_comp (1 ,:)= csv_data ( 1 , : ) ;
csv_data_comp (2 ,:)= csv_data ( end , : ) ;
% S c h l e i f e über d i e Anzahl der Punkte
f o r n=3:N
% neuen V e r l a u f i n t e r p o l i e r e n
csv_data_int=i n t e r p 1 ( csv_data_comp ( : , 1 ) , csv_data_comp ( : , 2 : end ) , csv_data ( : , 1 ) ) ;
% neuen Wert hinzufügen
csv_data_comp (n ,:)= csv_data (max( abs ( csv_data ( : , 2 : end)−csv_data_int ))==...
abs ( csv_data ( : , 2 : end)−csv_data_int ) , : ) ;
% s o r t i e r e n
csv_data_comp=s o r t r o w s ( csv_data_comp ) ;
end
% Modus überprüfen
i f strcmp ( modus , ’ semilogx ’ )
csv_data_comp (: ,1)= exp ( csv_data_comp ( : , 1 ) ) ;
e l s e i f strcmp ( modus , ’ semilogy ’ )
csv_data_comp ( : , 2 : end)=exp ( csv_data_comp ( : , 2 : end ) ) ;
e l s e i f strcmp ( modus , ’ l o g l o g ’ )
csv_data_comp=exp ( csv_data_comp ) ;
end
end