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

Erhöhe fortlaufende Nummerierung, wenn Bedingung erfüllt i

 

agent_fux
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 12.01.2017, 20:20     Titel: Erhöhe fortlaufende Nummerierung, wenn Bedingung erfüllt i
  Antworten mit Zitat      
Hallo zusammen,

ich habe eine Matrix B mit über 6000 Zeilen, welche eine Spalte mit fortlaufenden Sekunden beinhaltet und daneben eine Spalte mit der dazugehörigen Geschwindigkeit. Nun möchte ich Geschwindigkeit-Zeit-Aufzeichnung segmentieren in Micro-Trips. Ein Micro-Trip besteht aus Standphase v=0 und Fahrphase v>0. Diese Micro-Trips sollen fortlaufend nummeriert werden. Die Nummerierung darf sich erst erhöhen, wenn wieder die Geschwindigkeit v=0 erreicht ist. Um es besser zu veranschaulichen, wie ich es brauche, ist eine Tabelle im Anhang.

Mein Ansatz:

Code:

n= 1

For i= 1:size(B,1)

while B(i,3) >= 0
       
         B(i,1) = n

             If B(i,3) > 0 && B(i+1) == 0
           
             B(i+1,1) = n+1

             end
 
        end

end

 


Leider führt das nicht zum gewünschten Ergebnis. Ich hoffe ihr könnt mir helfen.

Beste Grüße

agent_fux

Micro-Trip.pdf
 Beschreibung:

Download
 Dateiname:  Micro-Trip.pdf
 Dateigröße:  171.2 KB
 Heruntergeladen:  364 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.01.2017, 21:03     Titel:
  Antworten mit Zitat      
Hallo,

und was passiert stattdessen?
Bekommst du eine Fehlermeldung? Weichen die Ergebnisse von den gewünschten ab?

Auf Anhieb sehe ich die Fehler, dass If und For großgeschrieben sind.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 13.01.2017, 17:07     Titel:
  Antworten mit Zitat      
Hallo,

zunächst einmal hier der korrigierte Quellcode:

Code:

n= 1

for i= 1:size(B,1)

while B(i,3) >= 0
       
         B(i,1) = n

             if B(i,3) > 0 && B(i+1,3) == 0
           
             B(i+1,1) = n+1

             end
 
        end

end
 


Nach dem Starten des Befehls landet Matlab in einer Endlosschleife und ich muss Matlab beenden, weil STRG+C im Workspace nicht funktioniert.
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: 13.01.2017, 23:48     Titel:
  Antworten mit Zitat      
Hallo agent_fux,

Es ist klar, dass Matlab hier in einer Endlos-Schleife landet:

Code:
while B(i,3) >= 0
        ...
end

Und in dem "..." wird B(i,3) nicht verändert. Dann muss es ja endlos werden.
Was genau soll dieser Programm-Abschnitt tun?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 14.01.2017, 12:37     Titel:
  Antworten mit Zitat      
Der Programm abschnitt soll, so lange der Wert in Zeile i, Spalte 3 >= 0 ist, den Wert n in Spalte 1 schreiben. Allerdings soll das nur so lange gemacht werden bis in i-ter Zeile der Wert in Spalte 3 >= 0 ist und in der darauffolgenden Zeile i+1 der Wert =0 ist. Danach soll n um 1 in i+1 Spalte 3 erhöht werden.
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: 15.01.2017, 13:00     Titel:
  Antworten mit Zitat      
Hallo agent_fux,

Dann meinst Du wohl etwas wie if B(i,3) >= 0 und nicht while .

Du suchst also nach den Zeilen, in denen das Element in der 3. Spalte >= 0 ist und in der darauffolgenden Zeile == 0. Richtig? Das erste Element soll dabei 1 sein:
Code:
match = [true; and(B(1:end-1, 3) >= 0, B(2:end, 3) == 0)];

Und jetzt soll an diesen Indizes der Wert der ersten Spalte um jeweils 1 erhöht werden:
Code:
B(:, 1) = cumsum(match);

Das geht also auch ohne Schleife sehr effizient. Hier nochmal mit Schleife:
Code:
n = 1;
for i = 1:size(B,1) - 1
  B(i, 1) = n;
  if B(i, 3) < 0 && B(i+1, 3) == 0
    n = n + 1;
  end
end

Um das letzte Element musst Du Dich dann noch einzeln kümmern, denn die Schleife kann ja nicht bis dort hin laufen, da B(i+1, 3) abgefragt wird.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 15.01.2017, 22:18     Titel:
  Antworten mit Zitat      
Die Variante ohne Schleife funktioniert nicht so ganz wie es sein soll. Der Befehl erhöht die Nummerierung in jeder Zeile, in der B(i,3) = 0. Erst wenn B(i,3) > 0 ist, wird die Nummerierung nicht erhöht bis B(i,3) = 0.

Die Variante mit Schleife führt zum Ergebnis. Abhilfe für die letzte Zeile schafft ein Hilfsvektor, der vorübergehend für die Schleife eingefügt und danach wieder gelöscht wird.
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 17.01.2017, 10:07     Titel:
  Antworten mit Zitat      
An dieser Stelle möchte ich mich bedanken für eure Hilfe. Smile
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: 17.01.2017, 17:05     Titel:
  Antworten mit Zitat      
Hallo agent_fux,

Zitat:
Die Variante ohne Schleife funktioniert nicht so ganz wie es sein soll.

Dann passe sie doch einfach an. Die Idee die entsprechenden Elemente auf 1 zu setzen und dann per cumsum die Ausgabe zu erzegen, sollte verständlich geworden sein, oder? Dann ist der Rest Feintuning.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 17.01.2017, 17:12     Titel:
  Antworten mit Zitat      
Die Idee mit cumsum habe ich nicht verstanden. Ist aber auch nicht schlimm. Ich habe die Variante mit der Schleife übernommen und die funktioniert so wie ich es brauche. Smile
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 - 2024 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.