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

Beim Wechsel der Zahl hochzählen lassen

 

FrenktheCast
Forum-Anfänger

Forum-Anfänger


Beiträge: 41
Anmeldedatum: 23.11.07
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 21.11.2014, 15:48     Titel: Beim Wechsel der Zahl hochzählen lassen
  Antworten mit Zitat      
Hallo

Aus einem Vektor a möchte ich, immer beim Intervallwechsel, hoch zählen lassen. Das Intervall soll passend in b abgelegt werden so das ersichtig lich ist zu welchem Intervall der Wert gehört.

Code:
a=[1 1 1 2 2 2 2 1 1 2 2 2 2 2 1 1 1 2 2 2 2 1 2 2 2 1]


und daraus soll:

Code:
b=[1 1 1 2 2 2 2 3 3 4 4 4 4 4 5 5 5 6 6 6 6 7 8 8 8 9]


werden

Bisher nutze ich folgende Variante die aber mehr mehreren zehn Tausend Datenpunkten sehr langsam ist

Code:
Intervall=1;
c(1)=1;
for i=2:length(a)
    if a(i)~=a(i-1)
      Intervall=Intervall+1;
      c(i)=Intervall;
    else
      c(i)=Intervall;  
    end
       
end


Danke!

Zuletzt bearbeitet von FrenktheCast am 21.11.2014, 16:03, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.11.2014, 15:51     Titel:
  Antworten mit Zitat      
Hallo,

Code:


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 41
Anmeldedatum: 23.11.07
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 21.11.2014, 16:03     Titel:
  Antworten mit Zitat      
danke für die sehr schnelle Antwort Harald!
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: 23.11.2014, 22:43     Titel: Re: Beim Wechsel der Zahl hochzählen lassen
  Antworten mit Zitat      
Hallo FrenktheCast,

Haralds Lösung ist natürlich genial.

Es lohnt sich aber danach zu suchen, warum Deine Schleife so langsam ist. Es fehlt nämlich die "Pre-allocation". Deshalb wird die Ausgabe-Variable "c" in jeder Iteration vergrößert. Das ist extrem ineffizient. Denn dadurch wird jedesmal ein neuer Vektor im Speicher alloziert und der Inhalt des alten kopiert. Falls der Input 1e5 Werte hat, bedeutet das, dass sum(1:1e5)*8 Byte alloziert und kopiert werden, also 40GB!
Mit Deiner Schleife benötigt das auf meinem Rechner 26 Sekunden.

Wenn man die Ausgabe aber "pre-alloziert" sinkt die Rechenzeit auf 0.006538 sec:

Code:
Intervall=1;
c = zeros(1, length(a));  % PRE-ALLOCATE!!!
c(1)=1;
for i=2:length(a)
    if a(i)~=a(i-1)
      Intervall = Intervall+1;
   end
   c(i)=Intervall;
end

Ich habe zusätzlich noch ein wenig vereinfacht, das spielt aber für die Laufzeit keine Rolle.

Gruß, Jan
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.