|
BlackWolf |

Forum-Anfänger
|
 |
Beiträge: 17
|
 |
|
 |
Anmeldedatum: 09.03.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 29.06.2015, 10:52
Titel: Schleifen-Index Problem
|
 |
|
 |
|
Hallo Zusammen,
ich versuche derzeit einen Datensatz in kleinere zu zerlegen und diese laufend aufzusummieren.
Hier mein bisheriger, nicht funktionierender Code:
Nun eine kleine Erklärung wie ich mir das vorstelle:
Ich habe einen Datensatz Data. Dieser ist 200000 Samples groß.
Die ersten 20000 brauche ich nicht, also lasse ich meinen Index ab 20000 laufen und auch nicht über den gesamten Datensatz.
Jetzt zum Hauptteil.
Immer ab einem Grenzwert von 150 (Amplitude) soll ein Teil des Datensatzes in einem Temporären Vektor gespeichert werden>A_temp und dieser dann in einem anderen Vektor aufsummiert werden>A_sum.
Zum eigentlichen Problem:
Sobald die FOR-Schleife für j beginnt will ich das in A_temp 40000 Werte gespeichert werden. Und diese sollen genau -20000 bis +20000 um den Schwellwert an der Stelle i sein. Leider weiß ich nicht genau wie ich das machen soll.
Sobald das abgeschlossen ist soll der Vektor A_temp zu A_sum aufaddiert werden. Der Index i wird danach um +25000 Werte verschoben, damit der nächste Schwellwert nicht doppelt vorkommt.
Ich hoffe jemand hat vielleicht eine Idee.
Schonmal vielen Dank für eure Hilfe
Mark
Zuletzt bearbeitet von BlackWolf am 29.06.2015, 12:08, insgesamt einmal bearbeitet
|
|
|
|
|
BlackWolf |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 17
|
 |
|
 |
Anmeldedatum: 09.03.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 29.06.2015, 11:49
Titel:
|
 |
So, ich hab den ganzen Algorithmus schonmal etwas verbessert:
Das Problem ist leider, das nach dem ersten Durchlauf des j-Index zwar der Index i auf +40000 gesetzt wird, aber sobald die erste for-Schleife wieder weiter geht, zählt diese nicht von i=58518, sondern wieder von 18518...
Und die j-for-Schleife macht danach natürlich auch nur mist..
Die Frage ist also, wie schaffe ich es das der Index i von 58518 weiter zählt und nicht wieder von vorne beginnt??
|
|
|
BlackWolf |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 17
|
 |
|
 |
Anmeldedatum: 09.03.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 29.06.2015, 12:30
Titel:
|
 |
Okay,
der Index i zählt am Anfang bis 38518, dort tritt zum ersten mal der Wert 150 auf. Dann folgt die j-Schleife. Die macht auch alles einwandfrei.
Allerdings wenn ich den Index i nachdem "end" der j-Schleife auf +40000 setze bringt das anscheinend gar nichts, weil der i-Index nachdem "end" der if-Anweisung bei 38519 weiter zählt.
Jetzt ist die Frage wie ich den Index i um plus 40000 verschoben weiter zählen lasse?
|
|
|
BlackWolf |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 17
|
 |
|
 |
Anmeldedatum: 09.03.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 29.06.2015, 12:55
Titel:
|
 |
Und ich hab meine Frage selber beantwortet
Hier der funktionierende Code:
Den Schleifenindex darf man natürlich nicht innerhalb der Schleife ändern wie ich es vorher getan habe. Wieder was dazu gelernt
|
|
|
BlackWolf |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 17
|
 |
|
 |
Anmeldedatum: 09.03.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 29.06.2015, 13:27
Titel:
|
 |
Okay, es gibt vielleicht doch noch was wo mir evtl. wer helfen könnte.
Kann man das ganze schneller bzw effizienter gestalten?
Mit einem großen Datensatz dauert das so sehr lange...
|
|
|
Winkow |

Moderator
|
 |
Beiträge: 3.842
|
 |
|
 |
Anmeldedatum: 04.11.11
|
 |
|
 |
Wohnort: Dresden
|
 |
|
 |
Version: R2014a 2015a
|
 |
|
|
 |
|
Verfasst am: 01.07.2015, 01:35
Titel:
|
 |
mir ist da einiges noch nicht ganz klar und ohne konkreten datensatz kann man schwer rumexperimentierne. es ist immer einfacher wenn ein lauffähiges beispiel gepostet wird.
ich finde den code sowieso seltsam.
dein i läuft ja von 1 bis irgendwo und dein j aber von i-20000... negative indizes sind aber garnicht zugelassen. das sollte abhängig von den daten einen fehler geben.
anstadt der äußeren schleife kann man bestimmt auch find und logisches indizieren benutzen.
deine matrix A_temp dürfte auch sehr viele nullen haben da du einfach irgendwo indizierst. und danach alle nullen löscht.... das macht für mich keinen sinn.
ich verstehe auch nicht die summe danach... da werden doch arrays unterschiedlicher größe addiert?...
das ist mir alles unklar.
_________________
richtig Fragen
|
|
|
BlackWolf |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 17
|
 |
|
 |
Anmeldedatum: 09.03.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.07.2015, 09:27
Titel:
|
 |
|
 |
|
Hey Winkow.
Erstmal vielen Dank für deine Antwort.
Ich poste jetzt mal den vollständigen und aktuellen Code:
Ich habe aussen eine while-Schleife, die über die komplette länge meines Datensatzes läuft. Dann folgen die beiden ersten if-Anweisungen, die dafür da sind, dass der Datensatz vorne und hinten angepasst wird, damit die for-Schleife nicht ins Leere läuft.
Zur dritten if-Anweisung. Wenn mein Datensatz nun einen Schwellwert von >= 140 erreicht, wird das Temporäre Array A_temp Null gesetzt.
Danach kommt die for-Schleife, die 40000 Werte in A_temp packt.
Diese 40000 Werte sind in einem Intervall von -20000 < i < 20000 und i hat einen Wert von mindestens 20100 (siehe erste if-Anweisung), so vermeide ich negative Indizes.
Und zum guten Schluss wird das ganze aufsummiert, so das bei jedem neuen Schwellwert A_temp neu gefüllt wird und dann auf A_sum draufsummiert wird.
Danach wird der Index i noch um +2000 verschoben damit vermieden wird das der selbe Ausschlag nochmal drauf gerechnet wird.
Die Signal-Datei geb ich jetzt auch mal dazu.
Das Programm macht genau den Job den ich will. Nur ab einer grösseren Anzahl von Werten, wo ich z.B. 50 mal einen Schwellwert erreiche mit 5.000.000 Datenpunkten dauert das viel zu lange. Ein bis zwei Stunden und das ist nicht gut...
Daher bin ich für jegliche Optimierung offen.
PS: Das Nullen Problem in A_temp löse ich derzeit mit dem Ausdruck
Beschreibung: |
|
 Download |
Dateiname: |
Signal_200000.txt |
Dateigröße: |
976.56 KB |
Heruntergeladen: |
375 mal |
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 01.07.2015, 09:39
Titel:
|
 |
Hallo,
hast du mal den Profiler laufen lassen? Wo wird denn die meiste Zeit verbraucht?
Ich würde hier nicht importdata verwenden, da das ja die (dir vermutlich bekannte) Dateistruktur erstmal analysieren muss. textscan kann da deutlich effizienter sein.
Grüße,
Harald
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 01.07.2015, 10:05
Titel:
|
 |
|
 |
|
Hallo BlackWolf,
Das sieht merkwürdig aus:
A_temp ist im Allgemeinen nach der Schleife ein Vektor. Diesen dann zu A_sum zu addieren funktioniert nur, wenn alle A_temp die gleiche Größe haben. Ist das immer der Fall? Oder meinst Du:
Es ist extrem Zeitraubend, den Vektor A_temp in jeder Iteration zu vergrößern und wieder zu verkleinern. Dabei muss immer eine neues Array im Speicher alloziert werden, was eine teure Operation ist, alle bisherigen Speicherzellen kopiert werden und der alte speicher freigegeben werden. Und das 80'000 mal.
Das geht effizienter:
Das erspart 79'999 mal das Allozieren und Kopieren eines Vektors. Das sollte also bedeutend schneller sein.
Wozu dient eigentlich das
A_temp(j,:) = Data(j)
? Muss hier wirklich in das j.te Element von A_temp geschrieben werden? Warum?
Ist in dieser Schleife wirklich sichergestellt, dass i>20000 ist? Nein!
Du hast mehrere verschiedene Codes gepostet, die unterschiedliche Dinge berechnen. Mal geht die Schleife in 1000er Schritten, mal nicht. Insofern weiß ich nicht genau, was das Programm eigentlich leisten soll. Die Version von 29.06.2015, 10:52 sieht noch am stabilsten aus:
Und die bereinigt:
Statt die Schleife über alle Elemente von Data laufen zu lassen, kannst Du auch zunächst die interessanten Punkte finden:
Dabei können die Punkte allerdings auch einen Abstand < 20'000 haben, was man berücksichtigen müsste.
Gruß, Jan
Zuletzt bearbeitet von Jan S am 01.07.2015, 10:09, insgesamt 2-mal bearbeitet
|
|
|
BlackWolf |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 17
|
 |
|
 |
Anmeldedatum: 09.03.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.07.2015, 10:06
Titel:
|
 |
Hallo Harald,
ich denke Jan S hat gerade gezeigt wo die meiste Zeit verbraucht wird, das geht so jetzt schon wesentlich schneller. Den Profiler hab ich noch nie vorher benutzt, werde es aber mal ausprobieren.
Hallo Jan,
vielen Dank für diese Verbesserung. Es geht wie schon erwähnt nun wirklich schneller.
A_temp(j,: ) = Data(j) war komplett sinnfrei wenn ich mir das jetzt so ansehe.
Zitat: |
Ist in dieser Schleife wirklich sichergestellt, dass i>20000 ist? Nein! |
Gerade denke ich schon das das sichergestellt wird, da ein Peak maximal eine Breite von 950 besitzt und wenn der Wert von >= 140 das erste mal erreicht wird bevor i > 20000 wird, wird es dadurch einige 10000 samples dauern bis Data(i) >= 140 ist.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 01.07.2015, 10:09
Titel:
|
 |
Hallo BlackWolf,
Ich hatte meinen Post gerade nochmal überarbeitet. Am Ende steht eine kompakte und einfache Schleifen-Version, die ich bevorzugen würde.
Gruß, Jan
|
|
|
BlackWolf |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 17
|
 |
|
 |
Anmeldedatum: 09.03.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.07.2015, 10:18
Titel:
|
 |
Hallo Jan,
das habe ich mir jetzt auch mal angeschaut und das Programm läuft jetzt sehr schnell und so wie ich es mir vorstelle.
Zu der bereinigten Version von dir, durch
habe ich am Ende eine Summe und keinen Vektor mit 40000 Werten.
Aber da überlege ich mir nochwas.
Fakt ist das mein Code nun wesentlich schneller läuft als am Anfang und dafür bin ich wirklich dankbar!
Grüsse,
BlackWolf
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|