Verfasst am: 31.08.2011, 10:37
Titel: Ereignisse eingrenzen und addieren
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;
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?
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 isset to high
// This state is kept, until Nreset consecutive pulses are zero again.
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);
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:
D.h. die Nullen eliminiert. Müsste eigentlich so klappen. Viele Grüße!
Einstellungen und Berechtigungen
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
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.