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

Ereignisse eingrenzen und addieren

 

matlabbeginner
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2011, 10:37     Titel: Ereignisse eingrenzen und addieren
  Antworten mit Zitat      
Hallo Forum,

ich habe einen langen Vektor, in dessen 5. Spalte meistens Nullen stehen. Steht dort jedoch keine Null (bzw. exakter ist der Wert >0.1) so beginnt ein Ereignis. Das Ereignis hört auf, wenn die fortlaufenden Einträge in der 5. Spalte 4x hintereinander <0.1 sind. Sind sie nur z.B. 3x kleiner 0.1, so bleibt das Ereignis bestehen. Von den Ereignissen möchte ich in zwei Vektoren zum einen die Dauer (=Anzahl der Zeilen, jede Zeile repräsentiert eine Zeiteinheit) und zum anderen die Summe der Werte pro Ereignis aufaddieren. D.h. die Länge der beiden Vektoren gibt mir am Ende die Anzahl der Ereignisse wieder; die Einträge in den beiden Vektoren die Dauer bzw. die Summe des 1., 2., 3. usw. Ereignisses.
Jetzt habe ich etwas versucht, komme aber nicht klar, wie Matlab die Zähler wieder so auf 1 setzt, dass das gewünschte Ergebnis raus kommt:

Code:

Summe=[];
Dauer=[];
dauer_part=[];
summe_part=[];
m=1;
k=1;
count=1;
for i=1:length(w1)
    if w1(i,5)>=0.1
        dauer_part(m)=1;
        summe_part(m)=w1(i,5);
        m=m+1;
        count=1;
       
    else
        if count>4
            Summe(k)=sum(summe_part);
            summe_part=[];
            Dauer(k)=sum(dauer_part);
            dauer_part=[];
            k=k+1;
            m=1;
            count=1;
        end        
        dauer_part(m)=0;
        summe_part(m)=w1(i,5);
        m=m+1;
        count=count+1;
       
       
    end
end

Ich weiß, dass das obige nicht richtig ist. Mit meiner Variable count komme ich nicht zum Ergbnis, weil er zwar bei der if Abfrage >4 zunächst richtig "entscheidet", danach aber bei weiteren vielen Nulleinträgen hintereinander wieder bis 4 zählt und mir dort die Nullen aufsummiert.Wie kann man die "Ereigniserkennung" besser formulieren?
Private Nachricht senden Benutzer-Profile anzeigen


aj.geissler
Forum-Guru

Forum-Guru



Beiträge: 251
Anmeldedatum: 26.11.07
Wohnort: Seeheim-Jugenheim
Version: ---
     Beitrag Verfasst am: 31.08.2011, 12:08     Titel:
  Antworten mit Zitat      
Hi,

im Grunde brauchst Du so etwas wie eine Vorverarbeitung für Dein Flip-Flop.
Bei sehr langen Vektoren kann Dein Berechnungsansatz sehr lange dauern.

Ich hatte mal so etwas in SciLab realisiert.

Kann man sicherlich leicht auf MatLab portieren...

Code:

function Qout=memorytoggle(Qin,Nset,Nreset);
// memorytoggle
//
//             FlipFlop controlled by sequence of states
//
//             Qout=memorytoggle(Qin,Nset,Nreset)
//
//   The boolean input vector Qin controlls a Flip-Flop operation.
//   If at least Nset consecutive pulses are 1, the flip-flop output is set to high
//   This state is kept, until Nreset consecutive pulses are zero again.

if type(Qin)==4,
   Qin=bool2s(Qin);
end

LQin=length(Qin);
Nmax=max([Nset,Nreset])

Qovl=Qin(1:$-Nmax+1);
for p=2:1:Nmax,
   Qovl=[Qovl;Qin(p:$-Nmax+p)];
end

Qsetm=Qovl;
Qset=sum(Qsetm,'r');
Qset=bool2s(Qset>=Nset);

Qresetm=bool2s(~Qovl);
Qreset=sum(Qresetm,'r');
Qreset=bool2s(Qreset>=Nreset);

Qff=[Qset;Qreset];
Qout=MTGG_flipflop(Qff);
Qout=[zeros(1,Nmax-1),Qout];

endfunction

// ---------------------------------------------------------------------------------


function Q=MTGG_flipflop(A)
// flipflop
//  Q=flipflop(A);
//
//  A:  Matrix with 2 rows. 1 row contains SET events, 2nd row reset events
//      A may contain double values. LOW values are defined by A<=0.5,
//      HIGH is defined by A>0.5
//  Q:  matrix with 1's and 0's, representing the output of the flipflop
A=double(A>0.5);

A=A.';
ks=1:1:size(A,1);

wxor=((A(:,1)&~A(:,2))|(~A(:,1)&A(:,2)));
ksdef=ks(double(wxor)~=0);
B=A(ksdef,:);

Bvec=2 .*B(:,1) + B(:,2);

dbv=[1;diff(Bvec)];
kredundant=find(dbv==0);

ksredu=ksdef(kredundant);
A(ksredu,:)=zeros(length(ksredu),2);

knotdef=ks(A(:,1)==1 & A(:,2)==1);
A(knotdef,:)=zeros(length(knotdef),2);

Q=A;
ks=1:1:size(Q,1);

Qxor=double(Q(:,1)&~Q(:,2))|(~Q(:,1)&Q(:,2));

ksdef=ks(Qxor~=0);
ksdef=ksdef(1);
if Q(ksdef,1)==0 & Q(ksdef,2)==1,
   Q(ksdef,2)=0;
end

Q=Q(:,1)-Q(:,2);
Q=cumsum(Q).';

endfunction;
 


Grüße
Andi
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabbeginner
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2011, 13:09     Titel:
  Antworten mit Zitat      
Super, Andi, vielen Dank. Ich kann es zwar nicht in Matlab eins zu eins umsetzen, aber es war ein guter Denkanstoß! Ich habe das Problem wie folgt gelöst:

Code:

Summe=[];
Dauer=[];
dauer_part=[];
summe_part=[];
m=1;
k=1;
count=1;

for i=1:length(w1)
    if w1(i,5)>=0.1
        dauer_part(m)=1;
        summe_part(m)=w1(i,5);
        m=m+1;
        count=1;
       
    else
        if count>4 %&& sum(dauer_part)~=0  
            Summe(k)=sum(summe_part);
            summe_part=[];
            Dauer(k)=sum(dauer_part);
            dauer_part=[];
            k=k+1;
            m=1;
            count=1;
        end        
        dauer_part(m)=0;
        summe_part(m)=0;
        m=m+1;
        count=count+1;
       
       
    end
end
Dauer=Dauer';
Summe=Summe';
A=horzcat(Dauer,Summe);
A(A(:,1)==0,:)=[];
 

D.h. die Nullen eliminiert. Müsste eigentlich so klappen. Viele Grüße!
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.