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

Intervalllänge von einsen

 

lilov
Forum-Century

Forum-Century


Beiträge: 193
Anmeldedatum: 05.05.10
Wohnort: Bremerhaven
Version: ---
     Beitrag Verfasst am: 06.05.2011, 10:37     Titel: Intervalllänge von einsen
  Antworten mit Zitat      
Hallo,

ich habe eine Matrix die so ähnlich aussieht:

Code:


A = [1 1 0 1 1 1 1 0 1 1 1]';

 


Vllt kennt jemand von euch einen Befehl, der die Intervalllängen abzählt. Das Ergebnis sollte so aussehen:


Code:


B = [2 2 0 4 4 4 4 0 3 3 3]';
 


Ich möchte das Ganze ohne Schleifen durchführen da meine Matrizen ziemlich groß sind. Danke im Voraus!

Gruß,

Hristo
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.05.2011, 15:48     Titel: Re: Intervalllänge von einsen
  Antworten mit Zitat      
Hallo lilov,

Sind die Nullen einzeln, oder treten die auch in Gruppen auf?
Hinweis: "find(A == 0)", "findstr(A, [0,1])"...
Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
lilov
Themenstarter

Forum-Century

Forum-Century


Beiträge: 193
Anmeldedatum: 05.05.10
Wohnort: Bremerhaven
Version: ---
     Beitrag Verfasst am: 10.05.2011, 08:58     Titel:
  Antworten mit Zitat      
Hi Jan,

danke für dein Antwort. Sie treten auch gruppenweise auf....ich hab es auf Umwege durch diff usw gelöst..nur ich hatte gehofft dass es auch eine elegante Lösung gibt...

Gruß,

lilov
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: 10.05.2011, 23:45     Titel:
  Antworten mit Zitat      
Hallo lilov,

Vielleicht gibt es eine elegantere Lösung. Möchtest Du denn Deine mal posten? DIFF, CUMSUM und STRFIND sind wahrscheinlich gute Helfer bei solchen Indizierungen.

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

Forum-Century

Forum-Century


Beiträge: 193
Anmeldedatum: 05.05.10
Wohnort: Bremerhaven
Version: ---
     Beitrag Verfasst am: 11.05.2011, 09:41     Titel:
  Antworten mit Zitat      
Hi Jan,

danke erstmal für deine schnelle Antwort!Hier ist meine bisherige Lösung:

Code:


A = [1 1 0 1 1 1 1 0 0 0 0 1 1 1]';
chnidx1 = find(diff([0;A])==1); %index where number changes from 0 to 1
chnidx2 = find(diff([A;0])==-1);%index where number changes from 1 to 0

A1 = zeros(length(A),1);

for i = 1:length(chnidx1)
   
   A1(chnidx1(i):chnidx2(i)) = A(chnidx1(i):chnidx2(i)).*(chnidx2(i)-chnidx1(i)+1);
   
end
 


Gruß,

lilov
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: 11.05.2011, 12:15     Titel:
  Antworten mit Zitat      
Hallo lilov,

Ich habe es etwas beschleunigen können:
Code:
function r = myIndexFunction(M)
n     = numel(M);
Mp    = [0, M, 0];
J0    = strfind(Mp, [0,1]);
J1    = strfind(Mp, [1,0]);
Len   = J1 - J0;
m     = zeros(1, n);
m(J0) = Len;
if M(n)
   nJ1 = length(J1) - 1;
   m(J1(1:nJ1)) = -Len(1:nJ1);
else
   m(J1) = -Len;
end
r = cumsum(m);

FIND(DIFF) wird dadurch langsamer, dass DIFF erstmal einen neuen Vektor erzeugen muss, während STRFIND nur die gefundenen Indices zurückgeben muss. Während die eigentlichen Berechnungen im Prozessor sehr schnell bearbeitet werden, ist das Allozieren von Speicher für temporäre Vektoren ein Flaschenhals.

Der zweite Trick war das vermeiden der Schleife, indem die Längen Len mal positiv und mal negativ in einen Vektor aus Nullen geschrieben werden. CUMSUM bastelt dann die Gewünschte Ausgabe sehr schnell, gerade wenn der Input-Vektor etwas größer ist, z.B. 200.000 Elemente...

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

Forum-Century

Forum-Century


Beiträge: 193
Anmeldedatum: 05.05.10
Wohnort: Bremerhaven
Version: ---
     Beitrag Verfasst am: 11.05.2011, 19:11     Titel:
  Antworten mit Zitat      
funktioniert super!!! danke Jan!
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: 11.05.2011, 21:07     Titel:
  Antworten mit Zitat      
Hallo lilov,

Gerne! "Elegant" sieht das allerdings nicht aus... Aber die Geschwindigkeit ist gut!

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.