Derzeit entwickle ich ein grafisches LCD-System, um Temperaturen, Strömungen, Spannungen, Leistung und Energie in einem Wärmepumpensystem anzuzeigen. Die Verwendung eines grafischen LCD bedeutet, dass die Hälfte meiner SRAM und.75 meines Blitzes von einem Bildschirmpuffer verbraucht worden sind Und Strings. Ich zeige derzeit min max durchschnittliche Zahlen für Energie Um Mitternacht, wenn die Tageszahl zurückgesetzt wird, prüft das System, ob der Verbrauch für den Tag über oder unter dem vorherigen Minimum oder Maximum liegt, und speichert den Wert Der Mittelwert wird durch Division berechnet Der kumulative Energieverbrauch durch die Anzahl der Tage. Ich möchte den täglichen Durchschnitt über die letzte Woche und Monat 4 Wochen für die Einfachheit iea rollen durchschnittlich anzeigen Momentan bedeutet dies die Aufrechterhaltung einer Reihe von Werten für die letzten 28 Tage und die Berechnung eines Durchschnitts über die Ganze Array für monatliche und letzte 7 Tage für wöchentlich. Initial war ich dies mit einer Reihe von Schwimmern, wie die Energie in der Form 12 12kWh ist, aber das war mit 28 4 Bytes 112 Bytes 5 4 von SRAM Ich habe nichts dagegen, nur zu haben Ein einziger Dezimalpunkt der Auflösung, also wechselte ich zur Verwendung von uint16t und multipliziere die Figur mit 100 Dies bedeutet, dass 12 12 als 1212 dargestellt ist und ich teile mit 100 für Anzeigezwecke. Die Größe des Arrays ist jetzt bis zu 56 Bytes viel Besser. Es gibt keinen trivialen Weg, um die Figur zu einem uint8t zu reduzieren, dass ich sehen kann, dass ich den Verlust einer Dezimalstelle 12 1kWh anstelle von 12 12kWh tolerieren könnte, aber Verbrauch ist häufig höher als 25 5kWh 255 der höchste Wert, der durch dargestellt wird Ein 8-bit unsigned integer Der Konsum war nie unter 10 0kWh oder über 35 0kWh, also denkbar konnte ich 10 von den gespeicherten Figuren subtrahieren, aber ich weiß, dass wir eines Tages diese Grenzen überschreiten werden. Ich habe dann Code getestet, um 9-Bit zu packen Werte in ein Array Dies ergibt einen Bereich von 0-51 2kWh und verwendet insgesamt 32 Bytes Allerdings ist der Zugriff auf ein Array wie dieses ist ziemlich langsam, vor allem, wenn Sie über alle Werte iterieren müssen, um einen Durchschnitt zu berechnen. So meine Frage ist - ist Dort eine effizientere Art, einen gleitenden Durchschnitt mit drei Fenstern zu berechnen - Lebensdauer, 28 Tage und 7 Tage Effizienz bedeutet kleiner in Bezug auf SRAM-Nutzung, aber ohne die Strafe von riesigem Code Kann ich vermeiden, alle Werte zu speichern. die Mar 7 14 bei 8 32.Ich habe gedacht und du hast recht So, dass technisch meine Antwort falsch macht Ich investiere etwas mehr Zeit und Geduld in sie Vielleicht etwas aus der Box Ich lasse Sie wissen, ob ich mit etwas kommen Wir tun so etwas wie ein Viel an meinem Arbeitsplatz Lassen Sie mich fragen um Entschuldigung über die Verwirrung Aditya Somani Mar 8 14 um 17 15.is gibt es eine effizientere Art und Weise der Berechnung eines gleitenden Durchschnitt mit 28 Tagen und 7 Tage müssen sich an 27 Tage Geschichte erinnern. Sie könnten in der Nähe kommen Genügend Speicherung von 11 Werten anstatt 28 Werte, vielleicht etwas wie. Mit anderen Worten, anstatt jedes Detail von jedem Tag für die letzten 27 Tage zu speichern, ein Speicher 7 oder so Werte der detaillierten täglichen Informationen für die letzten 7 oder so Tage, und Auch b speichern 4 oder so zusammengefasste Werte der Gesamt - oder Durchschnittsinformation für jede der letzten 4 oder so Wochen. Ich habe im Wesentlichen ein Array von Werten wie diese. Das obige Array ist vereinfacht, ich sammle 1 Wert pro Millisekunde in meinem realen Code Und ich muss die Ausgabe auf einem Algorithmus verarbeiten, den ich schrieb, um den nächstgelegenen Peak vor einem Zeitpunkt zu finden. Meine Logik scheitert, weil in meinem Beispiel oben 0 36 der echte Peak ist, aber mein Algorithmus würde nach hinten schauen und die letzte Nummer sehen 0 25 als die Spitze, da es eine Abnahme auf 0 24 vor it. Das Ziel ist es, diese Werte zu nehmen und wenden Sie einen Algorithmus an sie, die glatt wird ein bisschen, so dass ich mehr lineare Werte, dh ich habe meine Ergebnisse zu Sei curvy, nicht jaggedy. Ich wurde gesagt, um einen exponentiellen gleitenden durchschnittlichen Filter auf meine Werte anzuwenden Wie kann ich das tun Es ist wirklich schwer für mich, mathematische Gleichungen zu lesen, ich befasse viel besser mit Code. Wie verarbeite ich Werte in meinem Array, Anwendung einer exponentiellen gleitenden durchschnittlichen Berechnung, um sie sogar out. asked Feb 8 12 bei 20 27. Um einen exponentiellen gleitenden Durchschnitt zu berechnen, müssen Sie einen Zustand um und Sie benötigen einen Tuning-Parameter Dies erfordert eine kleine Klasse vorausgesetzt, Sie verwenden Java 5 oder später. Instantiate mit dem Zerfall Parameter, den Sie tun können, sollte Tuning zwischen 0 und 1 und dann verwenden Sie durchschnittlich zu filtern. Wenn das Lesen einer Seite auf einige mathmatischen Wiederholung, alles, was Sie wirklich wissen müssen, wenn Sie es in Code ist das Mathematiker mögen Indizes in Arrays und Sequenzen mit Indizes schreiben Sie haben auch ein paar andere Notationen, die nicht helfen Aber die EMA ist ziemlich einfach, da man sich nur an einen alten Wert erinnern muss keine komplizierten Zustand Arrays required. answered Feb 8 12 Bei 20 42. TKKocheran Ziemlich viel isn t es nett, wenn die Dinge einfach sein können Wenn Sie mit einer neuen Sequenz beginnen, erhalten Sie einen neuen Mittelwert. Beachten Sie, dass die ersten paar Begriffe in der gemittelten Sequenz um ein bisschen wegen der Randeffekte springen, aber Sie bekommen Die mit anderen gleitenden Durchschnitten auch Allerdings ist ein guter Vorteil, dass man die gleitende durchschnittliche Logik in den Mittelalter einpacken und experimentieren kann, ohne den Rest Ihres Programms zu viel zu stören Donal Fellows Feb 9 12 bei 0 06.Ich habe eine harte Zeit zu verstehen Ihre Fragen, aber ich werde versuchen, irgendwie zu antworten.1 Wenn Ihr Algorithmus 0 25 statt 0 36 gefunden hat, dann ist es falsch Es ist falsch, weil es eine monotone Zunahme oder Abnahme annimmt, die immer nach oben geht oder immer hinuntergeht ALLE Ihre Daten, Ihre Datenpunkte - wie Sie sie präsentieren --- sind nichtlinear Wenn Sie wirklich wollen, um den maximalen Wert zwischen zwei Punkten in der Zeit zu finden, dann schneiden Sie Ihr Array von tmin zu tmax und finden Sie die max von diesem Subarray. 2 Nun, das Konzept der gleitenden Durchschnitte ist sehr einfach vorstellen, dass ich die folgende Liste 1 4, 1 5, 1 4, 1 5, 1 5 Ich kann es glätten, indem Sie den Durchschnitt von zwei Zahlen 1 45, 1 45, 1 45, 1 5 Beachten Sie, dass die erste Zahl der Durchschnitt von 1 5 und 1 4 Sekunden und erste Zahlen die zweite neue Liste ist der Durchschnitt von 1 4 und 1 5 dritte und zweite alte Liste der dritten neuen Liste der Durchschnitt von 1 5 Und 1 4 vierte und dritte, und so weiter hätte ich es Zeitraum drei oder vier, oder n Hinweis, wie die Daten ist viel glatter Ein guter Weg, um gleitende Durchschnitte bei der Arbeit zu sehen ist, um Google Finance zu gehen, wählen Sie eine Aktie versuchen Tesla Motoren ziemlich volatile TSLA und klicken Sie auf technische an der Unterseite des Diagramms Wählen Sie Moving Average mit einem bestimmten Zeitraum und Exponential gleitenden Durchschnitt, um ihre Unterschiede zu vergleichen. Exponentielle gleitenden Durchschnitt ist nur eine weitere Ausarbeitung von diesem, aber gewichtet die älteren Daten weniger als die neue Daten Dies ist ein Weg, um die Glättung in Richtung der Rückseite Bitte lesen Sie die Wikipedia-Eintrag. So, das ist mehr ein Kommentar als eine Antwort, aber die kleine Kommentar-Box war nur zu winzigen Viel Glück. Wenn Sie Probleme mit der Mathematik haben, Sie könnten mit einem einfachen gleitenden Durchschnitt statt exponentiell Also die Ausgabe, die Sie erhalten würde die letzten x Begriffe geteilt durch x Ungetestete Pseudocode. Hinweis, dass Sie die Start-und End-Teile der Daten zu behandeln, da klar können Sie t Durchschnitt der Letzte 5 Begriffe, wenn Sie auf Ihrem 2. Datenpunkt sind Auch gibt es effizientere Möglichkeiten zur Berechnung dieser gleitenden durchschnittlichen Summe Summe - älteste neueste, aber dies ist, um das Konzept von dem, was passiert über. Erwerben 8. Februar 12 um 20 41 zu bekommen. Ich habe vor kurzem über Fortschritte in der Antwort auf diesen Beitrag gelernt und habe mich gefragt, wie ich sie nutzen könnte, um einen gleitenden durchschnittlichen Filter effizienter zu berechnen als das, was ich in diesem Beitrag mit Faltungsfiltern vorgeschlagen habe. Das ist es, was ich bisher habe Die ursprüngliche Array dann rollt es durch die notwendige Menge und summiert die Kernel-Werte, um den Durchschnitt zu berechnen Ich bin mir bewusst, dass die Kanten nicht richtig behandelt werden, aber ich kann darauf achten, dass danach gibt es eine bessere und schnellere Weg Das Ziel ist zu filtern Große Gleitkomma-Arrays bis zu 5000x5000 x 16 Schichten in der Größe, eine Aufgabe, die ziemlich langsam ist. Hinweis, dass ich für 8-Nachbar-Konnektivität suche, das ist ein 3x3-Filter nimmt den Durchschnitt von 9 Pixeln 8 um das Fokus-Pixel und weist zu Dieser Wert auf das Pixel in das neue Bild. EDIT Klärung darüber, wie ich sehe diese working. use stridetricks, um ein Array wie 0,1,2, 1,2,3, 2,3,4 zu erzeugen, das der obersten Reihe von entspricht Der Filter kernel. Roll entlang der vertikalen Achse, um die mittlere Zeile des Kernels 10,11,12, 11,12,13, 13,14,15 und fügen Sie es auf die Array Ich habe in 1. Wiederholen, um den Boden zu bekommen Reihe des Kernels 20,21,22, 21,22,23, 22,23,24 An dieser Stelle nehme ich die Summe jeder Zeile und teile sie durch die Anzahl der Elemente im Filter, was mir den Durchschnitt für jeden gibt Pixel, verschoben von 1 reihe und 1 col, und mit einigen merkwürdigen runden runden, aber ich kann darauf achten, dass später. Was ich hoffte, ist eine bessere Verwendung von stridetricks, um die 9 Werte oder die Summe der Kernel-Elemente direkt zu bekommen , Für das ganze Array, oder dass jemand mich von einer anderen effizienteren Methode überzeugen kann. die 8. Februar 11 um 18 05. Für das, was es sich lohnt, hier s, wie du es mit fancy schreitenden Tricks machst, würde ich das gestern veröffentlichen , Wurde aber durch die eigentliche Arbeit abgelenkt. Paul essen beide haben schöne Implementierungen mit verschiedenen anderen Möglichkeiten, dies zu tun Nur um die Dinge aus der früheren Frage fortzusetzen, dachte ich, ich d post die N-dimensionalen Äquivalent. Sie werden nicht in der Lage sein, signifikant schlagen Funktionen für 1D-Arrays, sollte jedoch Beat though. Moreover, wenn Sie versuchen, ein multidimensionales bewegliches Fenster zu erhalten, riskieren Sie, Gedächtnisgebrauch zu sprengen, wann immer Sie versehentlich eine Kopie Ihres Arrays machen Während das anfängliche rollende Array gerade eine Ansicht in den Gedächtnis Ihres ursprünglichen Arrays ist, jedes mögliches Zwischenstufen, die das Array kopieren, machen eine Kopie, die Größenordnungen größer als Ihre ursprüngliche Array ist. Sagen wir, dass Sie mit einem 100x100 Original Array arbeiten. Die Ansicht in sie für eine Filtergröße von 3,3 wird 98x98x3x3 aber verwenden Das gleiche Gedächtnis wie das Original Allerdings werden alle Kopien die Menge an Speicher, dass eine volle 98x98x3x3 Array würde. Basically, mit verrückten Schritt Tricks ist ideal für, wenn Sie wollen vektorisieren bewegten Fenster Operationen auf einer einzigen Achse eines ndarray Es macht es Wirklich einfach, Dinge wie eine bewegte Standardabweichung zu berechnen, etc. mit sehr wenig Overhead Wenn du anfangen willst, dies auf mehreren Achsen zu tun, ist es möglich, aber du bist in der Regel besser mit mehr spezialisierten Funktionen wie etc. At jeden Preis, hier S wie du es machst. So was wir bekommen, wenn wir b Rolling Window a, filtsize ist ein 8x8x3x3 Array, das ist eigentlich ein Blick in den gleichen Speicher wie die ursprüngliche 10x10 Array Wir könnten genauso einfach verschiedene Filtergröße auf verschiedenen Achsen verwenden Oder nur auf ausgewählten Achsen eines N-dimensionalen Arrays betrieben werden, dh filtrieren 0,3,0,3 auf einem 4-dimensionalen Array würde uns eine 6-dimensionale Ansicht geben. Wir können dann eine beliebige Funktion auf die letzte Achse wiederholt anwenden, um effektiv zu berechnen Sachen in einem bewegten Fenster. Jedoch, weil wir vorübergehend temporäre Arrays speichern, die viel größer sind als unser ursprüngliches Array auf jedem Schritt von mittlerem oder std oder was auch immer, das ist überhaupt nicht Gedächtnis effizient Es wird auch nicht schrecklich schnell sein, entweder. Das Äquivalent für ndimage ist nur. This wird eine Vielzahl von Randbedingungen behandeln, die Unschärfe an Ort und Stelle, ohne dass eine temporäre Kopie des Arrays, und sehr schnell Stride Tricks sind ein guter Weg, um eine Funktion auf ein bewegtes Fenster anzuwenden Auf einer Achse, aber sie sind nicht ein guter Weg, um es entlang mehrere Achsen zu tun, in der Regel. Just meine 0 02, auf jeden Fall. Sehr gut setzen Striding Tricks sind ein guter Weg, um eine Funktion auf ein bewegtes Fenster auf einer Achse, Aber sie sind nicht ein guter Weg, um es entlang mehrerer Achsen zu tun, in der Regel Und natürlich ist Ihre Erklärung des Gedächtnisses sprengen ist wichtig eine Art von Zusammenfassung von Ihrer Antwort zumindest für mich ist don t gehen zu weit fischen, die quarenteed Fang ist Allready in scipy Danke essen Feb 9 11 bei 16 37. Danke, Joe, für diese Antwort Im Rolling-Fenster sollte das, wenn nicht hasattr zurückkehren Rollingwindowlastaxis anstatt Rolling Window unutbu Feb 12 11 bei 16 47. Ich bin nicht vertraut genug mit Python zu schreiben Code für das, aber die beiden besten Möglichkeiten, um Windungen zu beschleunigen ist entweder entweder den Filter zu trennen oder die Fourier-Transformation zu verwenden. Separated Filter Convolution ist OMN, wobei M und N sind Anzahl der Pixel im Bild und der Filter, bzw. Im Durchschnitt Die Filterung mit einem 3-by-3-Kernel ist gleichbedeutend mit der Filterung zuerst mit einem 3-by-1-Kernel und dann einem 1-by-3-Kernel. Sie können 3 3 3 3,30 Geschwindigkeitsverbesserung durch aufeinanderfolgende Faltung mit zwei 1-d-Kerneln erhalten Das wird offensichtlich besser, da der kernel größer wird Du kannst trotzdem auch Strass-Tricks verwenden, natürlich. Fourier Transform Conv A, B ist gleichbedeutend mit ifft fft A fft B iea Faltung im direkten Raum wird eine Multiplikation im Fourier Raum, wo A ist dein Bild und B ist dein Filter Da die elementweise Multiplikation der Fourier-Transformationen erfordert, dass A und B die gleiche Größe haben, ist B ein Array von Größe A mit deinem Kernel in der Mitte des Bildes und Nullen überall Um einen 3-by-3-Kernel in der Mitte eines Arrays zu platzieren, musst du A bis ungerade Größe aufnehmen. Je nach Implementierung der Fourier-Transformation kann dies viel schneller sein als die Faltung und wenn man denselben Filter anwendet Mehrfach, können Sie vorrechnen fft B speichern weitere 30 der Berechnungszeit. answered Feb 9 11 um 15 27.Für das, was es wert ist, in Python, diese sind in und jeweils Joe Kington umgesetzt 9 Feb 11 um 15 44. Jonas Cool Der getrennte Filteransatz funktioniert gut, wie Sie sagen, es spart mehr Zeit, wenn die Kernelgröße zunimmt Für ein 5000x5000 Array, bei einer 11x11 Kernelgröße bekomme ich 7 7s für 2d Faltung mit und 2 0s für zwei 1d Windungen mit Für Deine Zweite Lösung Was ist B Benjamin Feb 9 11 bei 16 02.Eines, was ich bin zuversichtlich muss behoben werden ist Ihr View-Array b. It hat ein paar Elemente aus nicht zugewiesenen Speicher, so dass Sie ll bekommen Abstürze. Geben Sie Ihre neue Beschreibung Ihres Algorithmus , Die erste Sache, die Fixierung braucht, ist die Tatsache, dass Sie außerhalb der Zuteilung von a. Weil ich noch immer nicht ganz die Methode und es scheint einfachere Möglichkeiten, um das Problem zu lösen, ich werde nur hier zu setzen. Die nur wie der einfache Ansatz scheint Die einzige externe Operation ist, dass es zugewiesen und bevölkert B nur einmal Alle Hinzufügung, Teilung und Indizierung muss getan werden, egal Wenn Sie 16 Bands tun, müssen Sie immer noch nur B zuweisen, wenn Ihr Absicht ist, ein Bild zu speichern Auch wenn dies keine Hilfe ist, könnte es klären, warum ich das Problem nicht verstehe, oder zumindest als Benchmark zur Zeit die Beschleunigungen anderer Methoden dienen. Dies läuft in 2 6 Sek. Auf meinem Laptop auf einem 5k X 5k Array von float64 s, 0 5 von denen ist die Schaffung von B. answered Feb 8 11 bei 19 31.It s nicht so klar bilden Sie Ihre Frage, aber ich vermute jetzt, dass Sie gerne verbessern diese Art von Mittelung. Wie, welche Art von Leistungsverbesserungen würden Sie eigentlich erwarten. Update Zunächst einmal eine Warnung der Code in it s aktuellen Zustand nicht richtig an die Kernel-Form. Allerdings ist das nicht meine primäre Besorgnis jetzt sowieso die Idee ist schon da Wie man sich richtig anpassen kann. Ich habe gerade die neue Form eines 4D A intuitiv gewählt, für mich ist es wirklich sinnvoll, über ein 2D-Kernel-Center nachzudenken, um auf jede Rasterposition von Original 2D zu zentrieren. Aber diese 4D-Gestaltung kann nicht wirklich sein Sei die beste, die ich denke, das eigentliche Problem hier ist die Leistung der Summierung Man sollte in der Lage sein, die beste Ordnung der 4D A inorder zu finden, um voll nutzen Sie Ihre Maschinen Cache-Architektur Allerdings ist die Reihenfolge nicht die gleiche für kleine Arrays, die Art von Kooperiert mit Ihrem Maschinen-Cache und die größeren, die don t zumindest nicht so einfach art. Update 2 Hier ist eine etwas modifizierte Version von mf Klar ist es besser, um ein 3D-Array neu zu ändern und dann anstatt zu summieren nur tun Dot Produkt das hat den Vorteil alle so, dass Kernel willkürlich sein Allerdings ist es noch etwas 3x langsamer auf meiner Maschine als Pauls aktualisiert function. answered Feb 8 11 bei 19 33.
No comments:
Post a Comment