|
|
ungewolltes vorzeitiges Abbrechen einer Schleife |
|
PatrickB |

Forum-Newbie
|
 |
Beiträge: 8
|
 |
|
 |
Anmeldedatum: 26.12.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.01.2016, 13:09
Titel: ungewolltes vorzeitiges Abbrechen einer Schleife
|
 |
Hallo ich habe ein Problem bei einer while schleife, die einen Datensatz "data" durchlaufen soll, jedoch manchmal vorzeitig beendet wird.
Es handelt sich dabei um folgenden Code Schnipsel:
Das Problem habe ich bereits erkannt:
In der Zeile am Ende mit "i = i+n" wird ja für i ein neuer Wert eingespeichert, diesen erhält dann wieder die while Bedingung mit "data(i)". Ist der Wert von "data(i)" direkt ohne weiteres durchzählen von i mit i = i+1 größer als x, bricht die schleife ab und beendet den Durchlauf. Wenn der Wert von i erst einmal kleiner ist, läuft die Schleife und gibt die für mich wichtigen "testdata_acc_aggr" aus.
Kann mir jemand einen Tipp geben, wie ich dieses Abbrechen vermeiden kann?
Vielen Dank und Grüße Patrick
|
|
|
|
|
Mmmartina |

Forum-Meister
|
 |
Beiträge: 745
|
 |
|
 |
Anmeldedatum: 30.10.12
|
 |
|
 |
Wohnort: hier
|
 |
|
 |
Version: R2020a
|
 |
|
|
 |
|
Verfasst am: 08.01.2016, 17:05
Titel:
|
 |
Ich rate einfach mal, dass das ersetzen der while schleife durch eine if-elseif/else-schleife helfen kann.
_________________
LG
Martina
"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
|
|
|
PatrickB |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 8
|
 |
|
 |
Anmeldedatum: 26.12.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.01.2016, 17:21
Titel:
|
 |
Hallo Martina,
danke für deine Antwort, aber wie kann ich denn eine if schleife dazu bringen sich immer wieder selbst zu wiederholen? Ich weiß nicht wie das geht und genau das ist für meine Anwendung wichtig..
Grüße Patrick
|
|
|
Mmmartina |

Forum-Meister
|
 |
Beiträge: 745
|
 |
|
 |
Anmeldedatum: 30.10.12
|
 |
|
 |
Wohnort: hier
|
 |
|
 |
Version: R2020a
|
 |
|
|
 |
|
Verfasst am: 08.01.2016, 18:36
Titel:
|
 |
Ah! Ok, ich habe das oben anders aufgefaßt.
Das was du machst, ich so lange der Wert an Stelle i kleiner einem Wert x ist, 40Schritte weiter zu gehen und dort wiederrum zu schauen. In jedem Durchlauf speicherst du dann einen bestimmten Wert zwischen, wenn der Wert an der nächsten Stelle (i+1) größer-gleich Wert x ist.
(Hinweis: i als Laufvariable ist sehr ungünstig, da du somit die imaginäre Einheit i überschreibst.)
Stimmt denn deine Abbruchbedingung?
Wenn ja, warum ist der Abbruch falsch?
Denn es bringt dir doch nichts, Werte zur Variablen testdata_acc_aggr hinzuzufügen, wenn die whileBedingung nicht erfüllt ist?
Zitat: |
und gibt die für mich wichtigen "testdata_acc_aggr" aus. |
Heißt das, dass du einfach nur nach Ende der Whileschleife diese Variable ausgegeben haben möchtest?
_________________
LG
Martina
"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
|
|
|
PatrickB |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 8
|
 |
|
 |
Anmeldedatum: 26.12.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 09.01.2016, 10:06
Titel:
|
 |
|
 |
|
So ganz stimmt das nicht, ich schreibe mal auf, was der Code macht
solange der Wert von data(i) kleiner x ist, soll sich i immer um eins erhöhen, sprich mein Programm läuft bildlich gesehen durch meinen Datensatz. Der ist gerne bis zu 10.000 Messwerte lang. Sobald data(i) größer als x ist, also die while Bedingung nicht mehr erfüllt ist, springt der Code zur if Bedingung und speichert hier die Variable "testdata..." welche sich aus m Messwerten vor dem aktuellen i und n Messwerten nach dem aktuellen i zusammensetzt. Ist das erfolgt wird i auf den Wert i+n gesetzt, damit die while schleife ab diesem Wert weiterlaufen kann.
Das Ziel der ganzen Geschichte ist eine Manövererkennung bei Autofahrten, wie zum Beispiel eine Kurve, falls dir das zum Verständnis hilft. Die Messdaten stammen von einem Beschleunigungssensor.
Das ganze funktioniert prima solange data(i+n) < x ist. Sobald es aber > x ist, wird der ganze Code beendet und springt nicht wie erwartet wieder zum if block.
Hoffe ich konnte es dir jetzt erklären und du kannst mir helfen, das wäre echt super!
Deinen Hinweis mit dem i werde ich berücksichtigen habe das schoneinmal gelesen, dass man i nicht als Laufvariable verwenden sollte aber bisher ignoriert, werde das ändern.
Grüße Patrick
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 09.01.2016, 15:53
Titel: Re: ungewolltes vorzeitiges Abbrechen einer Schleife
|
 |
Hallo PatrickB,
Bemerkung: Es gibt keine "IF-Scheifen". Insofern ist der Ratschlag wohl etwas verwirrend.
Du hast ausführlich beschrieben, was das Programm macht und erklärt, dass es nicht das macht, was Du möchtest. Es ist produktiver, wenn Du erklärst, was Du eigentlich erhlten möchtest.
Ist dies Dein Ziel:
* Finde alle Indices, bei denen die Werte des Vektors data >= dem Schwellenwert x sind.
* Speichere zu diesen Indices ein Intervall in einer Matrix.
* Die Intervalle sollen sich nicht überlappen.
Richtig?
Dann reicht eine einfache Änderung:
Das iterative Vergrößern der Ergebnisse ist dabei ineffizient.
Eine Pre-allocation ist auf jeden Fall hilfreich: Reserviere per
zeros
für die Ergebnisse die maximal mögliche Größe vor der Schleife. Am Schluss kannst Du die überflüssigen Elemente wieder entfernen.
Wenn das unklar ist, suche im Forum nach "pre-allocation" (oder ohne Bindestrich).
Gruß, Jan
|
|
|
PatrickB |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 8
|
 |
|
 |
Anmeldedatum: 26.12.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 09.01.2016, 16:17
Titel:
|
 |
Hallo Jan,
vielen Dank für deine Hilfe das funktioniert genau so wie ich es haben wollte!
Das mit der Pre-Allocation werde ich dann auch mal versuchen, kommt zwar für meinen Anwendungsfall nicht unbedingt auf die Geschwindigkeit an, aber besser wäre es sicher.
Grüße Patrick
|
|
|
|
|
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.
|
|