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

ungewolltes vorzeitiges Abbrechen einer Schleife

 

PatrickB
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2016, 13:09     Titel: ungewolltes vorzeitiges Abbrechen einer Schleife
  Antworten mit Zitat      
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:
Code:

n = 40; %Zu erfassende Datenanzahl nach i
m = 20; %Zu erfassende Datenanzahl vor i
i = 1;
k = 0;

while data(i) < x
    i = i+1;
    if data(i) >= x
        k = k+1;
        zeitpunkte_manoever_acc_aggr(k) = i;
        testdata_acc_aggr(:,k) = data((i-m):(i+n));
        i = i+n;
    end
end
 


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


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 08.01.2016, 17:05     Titel:
  Antworten mit Zitat      
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))
Private Nachricht senden Benutzer-Profile anzeigen
 
PatrickB
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2016, 17:21     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 08.01.2016, 18:36     Titel:
  Antworten mit Zitat      
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))
Private Nachricht senden Benutzer-Profile anzeigen
 
PatrickB
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2016, 10:06     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.01.2016, 15:53     Titel: Re: ungewolltes vorzeitiges Abbrechen einer Schleife
  Antworten mit Zitat      
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:
Code:

n = 40; %Zu erfassende Datenanzahl nach i
m = 20; %Zu erfassende Datenanzahl vor i
k = 0;

len = length(data) - n;
i = m + 1;  % Ansonsten ist "data(i-m:i+n)" ungültig

while i < len
    if data(i) < x
        i = i + 1;
    else
        k = k+1;
        zeitpunkte_manoever_acc_aggr(k) = i;
        testdata_acc_aggr(:,k) = data((i-m):(i+n));
        i = i + n;
    end
end

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
Private Nachricht senden Benutzer-Profile anzeigen
 
PatrickB
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2016, 16:17     Titel:
  Antworten mit Zitat      
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
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.