MATLAB: rechnen Mittelwerten der einzelnen 1-Minuten-Intervall von einer Zeit-Serie
Habe ich ein paar mal-Serie jeweils durch zwei Komponenten beschrieben, ein timestamp-Vektor (in Sekunden), und ein Vektor, der die Werte gemessen. Die Zeit, die Vektor ist nicht einheitlich (D. H. Stichprobe in unregelmäßigen Abständen)
Ich versuche, berechnen Sie den Mittelwert/SD jedes 1-Minuten-Intervall der Werte (X-Minuten-Intervall berechnen Sie den Mittelwert, den nächsten Intervall, ...).
Meine aktuelle Implementierung verwendet Schleifen. Dies ist ein Beispiel von, was ich habe, so weit:
t = (100:999)' + rand(900,1); %' non-uniform time
x = 5*rand(900,1) + 10; % x(i) is the value at time t(i)
interval = 1; % 1-min interval
tt = ( floor(t(1)):interval*60:ceil(t(end)) )'; %' stopping points of each interval
N = length(tt)-1;
mu = zeros(N,1);
sd = zeros(N,1);
for i=1:N
indices = ( tt(i) <= t & t < tt(i+1) ); % find t between tt(i) and tt(i+1)
mu(i) = mean( x(indices) );
sd(i) = std( x(indices) );
end
Frage ich mich, ob es ein schneller Vektorgrafik-Lösung. Dies ist wichtig, da ich eine große Anzahl von Zeit-Serie zu jedem Prozess sehr viel länger als die oben angezeigte Beispiel..
Jede Hilfe ist willkommen.
Danke an Euch alle für das feedback.
Korrigierte ich den Weg t
generiert werden stets streng monoton Steigend (sortiert), war dies nicht wirklich ein Problem..
Auch, ich habe nicht angegeben das klar, aber meine Absicht war es, eine Lösung für ein Intervall der Länge in Minuten (1-min war nur ein Beispiel)
InformationsquelleAutor merv | 2010-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einzige logische Lösung zu sein scheint...
Ok. Ich finde es komisch, dass für mich gibt es nur eine logische Lösung, aber viele andere finden andere Lösungen. Egal, die Lösung scheint einfach. Gegeben die Vektoren x und t, und einer Reihe von mit gleichem Abstand break Punkte tt,
(Beachten Sie, dass ich sortiert t oben).
Ich würde dies in drei vollständig vektorisiert Zeilen code. Erstens, wenn die Pausen wurden willkürlich und potentiell ungleiche Abstände, würde ich histc um zu ermitteln, welche Intervalle die Daten der Reihe fällt. Gegeben, Sie sind einheitlich, gerade dies zu tun:
Wieder, wenn die Elemente von t nicht bekannt waren, werden sortiert, würde ich verwendet haben, min(t) anstelle von t(1). Wenn dies erledigt ist, verwenden Sie accumarray zu verringern, die Ergebnisse in einen Mittelwert und die Standardabweichung.
vielen Dank, das ist prägnant und leicht zu Lesen
Ich wusste gar nicht, über accumarray. Vielen Dank für den Nachweis, wie nützlich es sein kann!
InformationsquelleAutor
Könnten Sie versuchen, und erstellen Sie ein cell-array und gelten Mittelwert und std über cellfun. Es ist ~10% langsamer als Ihre Lösung für die 900 Einträge, aber ~10x schneller für 90000 Einträge.
Anmerkung: meine Lösung nicht geben, die genauen gleichen Ergebnisse, als der ihrige, da Sie direkt ein paar mal die Werte am Ende (1:60:90 ist [1,61]), und seit Beginn des Intervalls ist nicht genau das gleiche.
t
es vielleicht nicht immer streng monoton Steigend, das war nicht beabsichtigt! [2] obwohl ich bin immer noch entschlüsseln den code, ich brauche wirklich die Intervall-Länge auf ein eingestellt (5-min ist das, was Im jetzt, aber das sollte leicht veränderbar)...[3] die Wahrheit ist, nach der Sie berechnet
stepIdx
habe ich ein wenig verloren 🙂 erklären könnte, wasnIdx
darstellt? Bekomme ich den Teil, wo Sie berechnen die minute-Teil für jede Buchung, dann nehmen Sie die Unterschiede zu finden, wo es Veränderungen, die den nächsten 1-min-Intervall, aber ich konnte nicht Folgen Sie nach, dass..nIdx ist die Anzahl, wie oft jeder index wird angezeigt. Ich brauche diese nutzen zu können mat2cell, der vertreibt die ersten n Werte in die erste Zelle, die zweite-n-Werte in der zweiten Zelle, usw., also die Gruppierung der Indizes, gehören zu jedem Zeitintervall. Ich hoffe, dass die zusätzlichen Kommentare, die helfen, machen es klarer. Sorry für das schreiben von hart-zu-Lesen-code. Sollte ich (gewesen) arbeiten etwas anders, so dass ich dies beantwortet in Eile 🙂
danke, ich Schätze die Hilfe,.. Was ist, wenn ich wollte einen anderen Intervall-Länge (und nicht nur 1 minute)? die aufeinander folgenden Differenzen trick wird nicht funktionieren, keine Ahnung, wie dies zu ändern ist für alle X-Minuten?
Siehe die Kommentare in der Funktion. Erstellen Sie einfach tIdx durch Division von N Sekunden, wobei N die Anzahl der Sekunden in der Zeitspanne.
InformationsquelleAutor Jonas
Hier ist ein Weg, der verwendet binäre Suche. Es ist 6-10x schneller für 9900 Elemente und über 64x-mal schneller für 99900 Elemente. Es war schwer zu bekommen verlässliche Zeiten mit nur 900 Elemente, also bin ich nicht sicher, was schneller ist bei dieser Größe. Es werden fast keine zusätzlichen Speicher, wenn Sie in Erwägung ziehen, tx direkt aus der generierten Daten. Außer, dass es nur vier zusätzliche float-Variablen (prevind, ersten, mittleren und letzten).
Es verwendet alle Variablen, die Sie ursprünglich hatten. Ich hoffe, dass es Ihren Bedürfnissen entspricht. Es ist schneller, da dauert es O(log N) zu finden, die Indizes mit binäre Suche, aber O(N) zu finden, der Ihnen den Weg, dass Sie es Taten.
Ich dachte, das wäre implizit, da es in der asker-code. Dies ist nur zu ersetzen Sie die letzten 5 Zeilen der Fragesteller den code. Ich dachte, dass die letzten 5 Zeilen wurden die langsamen.
Ist eine binäre Suche (mit Schlaufen) schneller als die Vektorgrafik-Vektor-Vergleich angefangen habe ich mit?
Ja, die Vergleiche von timings, die ich habe waren im Vergleich zu der version, die du gepostet hast in deine Frage. Vektorisieren bringt dich nur so weit, es macht es schneller zu tun, die gleiche operation auf jedes element als Schleife, aber es ist immer noch die operation auf jedes element. Das bedeutet, dass Ihre Methode keine 14*900 = 12600-Vergleiche (für 900-Elemente) zu finden, die Indizes nehmen den Mittelwert und std, während diese binary-search-Methode nicht weniger als 14*log_2(900) Vergleiche = 140 Vergleiche, Sie zu finden. Die Ungleichheit nur noch schlimmer mit Zunehmender array-Größe und Zunehmender Anzahl an Intervallen.
InformationsquelleAutor Justin Peel
Können Sie berechnen
indices
alle auf einmal mit bsxfun:Dies ist schneller als die Schleife, aber erfordert, speichern Sie Sie alle auf einmal (Zeit vs Raum Kompromiss)..
x(indices)
hat nicht funktioniert, statt dessen habe ich:for i=1:N, x(indices(:,i)), end
InformationsquelleAutor Amro
Disclaimer: ich arbeitete in diesem aus auf dem Papier, aber noch nicht die Gelegenheit hatte, es zu überprüfen, "in silico"...
Können Sie in der Lage sein, um zu vermeiden, Schleifen oder Verwendung von cell-arrays, indem Sie einige knifflige kumulative Summen, die Indexierung und Berechnung der Mittelwerte und Standardabweichungen selbst. Hier ist etwas code, der glaube ich, die Arbeit, obwohl ich unsicher bin, wie es stapelt sich Geschwindigkeit her zu den anderen Lösungen:
Den oben berechnet die Standardabweichung mit die Vereinfachung der Formel, die sich auf dieser Wikipedia-Seite.
InformationsquelleAutor gnovice
Die gleiche Antwort wie oben, aber mit dem parametrischen Intervall (
window_size
).Problem mit der Vektor-Längen gelöst.
InformationsquelleAutor msysmilu