Viktat Glidande Medelvärde C ++


Jag försöker att beräkna det rörliga genomsnittet av en signal Signalvärdet en dubbel uppdateras vid slumpmässiga tider Jag letar efter ett effektivt sätt att beräkna det s tidsvägd medelvärde över ett tidsfönster, i realtid kunde jag göra det själv, men det är mer utmanande än jag trodde. De flesta resurser som jag har hittat över internet beräknar glidande medelvärde av periodisk signal, men min uppdateras slumpmässigt. Vet du någon bra resurser för det. Tricket är följande Du får uppdateringar i slumpmässiga tider via tomt uppdatering int tid, float värde Men du måste också spåra när en uppdatering faller utanför tidsfönstret, så du ställer in ett larm som kallas vid tidpunkt N som tar bort den tidigare uppdateringen från att någonsin betraktas igen i beräkningen . Om det händer i realtid kan du begära operativsystemet att ringa till en metod som inte kan hämtas upp när du ska ringas vid tidpunkten. Om det här är en simulering kan du inte få hjälp från operativsystemet och du behöver d o det manuellt I en simulering skulle du kalla metoder med den tid som levereras som ett argument som inte korrelerar med realtid. Men ett rimligt antagande är att samtalen garanteras vara sådan att tidsargumenten ökar. I det här fallet behöver du Behåll en sorterad lista över alarmtidvärden och för varje uppdatering och lässamtal kontrollerar du om tidsargumentet är större än huvudet på larmlistan. Medan det är större tar du bort den larmrelaterade behandlingen av den äldsta uppdateringen, ta bort huvudet och kontrollera igen tills alla larm före den angivna tiden behandlas. Gör sedan uppdateringen. Jag har hittills antagit att det är uppenbart vad du skulle göra för den faktiska beräkningen, men jag kommer att utarbeta bara om jag antar att du har en metod att flyta Läs int tid som du använder för att läsa värdena Målet är att göra det här samtalet så effektivt som möjligt Så du beräknar inte det glidande genomsnittet varje gång läsmetoden heter. Istället förkräver du värdet som den senaste uppdateringen åt eller det sista larmet och tweak detta värde med ett par flytande punkter för att beräkna tidens gång sedan den senaste uppdateringen, dvs ett konstant antal operationer förutom att kanske bearbeta en lista med uppstapade alarm. Helt klart är detta klart - Detta borde vara en ganska enkel algoritm och ganska effektiv. Ytterligare optimering är ett av de återstående problemen om ett stort antal uppdateringar händer inom tidsfönstret, då finns det en lång tid som det inte finns läs eller uppdateringar och sedan en läsning eller uppdatering följer med I det här fallet kommer ovanstående algoritm att vara ineffektiv när man stegvis uppdaterar värdet för varje uppdatering som faller av. Detta är inte nödvändigt eftersom vi bara bryr sig om den senaste uppdateringen bortom tidsfönstret, så om det finns en väg För att effektivt släppa bort alla äldre uppdateringar, skulle det hjälpa. För att göra detta kan vi modifiera algoritmen för att göra en binär sökning av uppdateringar för att hitta den senaste uppdateringen före tidsfönstret Om det finns relativt få uppdateringar som behöver släppas kan man stegvis uppdatera värdet för varje uppladdad uppdatering. Men om det finns många uppdateringar som behöver släppas kan man ompröva värdet från grunden efter att ha släppt bort de gamla uppdateringarna. Bilaga om inkrementell beräkning Jag borde klargöra vad jag menar med inkrementell beräkning ovan i meningen tweak det här värdet med ett par flytande punkter för att beräkna tidens gång sedan den senaste uppdateringen Initial non-incremental computation. then iterate över relevanta uppdateringar i syfte att öka tiden. movingaverage summa uppdaterad Timeincelastupdate windowlength. Now om exakt en uppdatering faller utanför fönstret men inga nya uppdateringar anländer, justera summan som. notera att det är priorupdate som har sin tidstämpel modifierad till början av det sista fönstret och om en exakt uppdatering kommer in i fönstret men inga nya uppdateringar faller av, justera summan as. As det ska vara uppenbart är det här en grov skiss men förhoppningsvis visar det hur du kan upprätthålla medelvärdet så att det är O 1-operationer per uppdatering på avskrivningsbasis. Notera ytterligare optimering i föregående stycke. Observera även stabilitetsproblem som hänvisas till i ett äldre svar, vilket innebär att flytpunktsfel kan ackumuleras över ett stort antal inkrementella operationer så att det finns en avvikelse från resultatet av den fullständiga beräkningen som är signifikant för applikationen. Om en approximation är OK och det är en minimal tid mellan proverna, kan du prova supersampling. Har en matris som representerar jämnt fördelade tidsintervall som Är kortare än minimumet och vid varje tidsperiod lagrar det senaste provet som erhölls. Ju kortare intervallet desto närmre genomsnittet kommer att vara den verkliga värdet e Perioden ska inte vara större än hälften av läget eller det finns en chans att sakna ett prov. Beslutad den 15 december kl. 18 12. Svarat den 15 december kl. 22 38. Tack för svaret En förbättring som skulle behövas Cache värdet av det totala genomsnittet så att vi inte slår hela tiden. Det kan också vara en liten punkt, men skulle det inte vara mer effektivt att använda en deque eller en lista för att lagra värdet, eftersom vi antar att uppdateringen kommer att komma i rätt ordning Infoga skulle vara snabbare än i kartan Arthur Dec 16 11 på 8 55.Ja, du kan cache värdet av summa. Subtrahera värdena på de prov du raderar, lägg till värdena på de prover du lägger in. Dessutom, ja, Ett deque par Exempel, Datum kan vara effektivare Jag valde kartan för läsbarhet och det enkla att påkalla kartan övre delen Som alltid skriver du rätt kod först, sedan profilera och mäta inkrementella förändringar Rob Dec 16 11 på 15 00. Notera Tydligen är detta inte sättet att närma sig detta Lämna den här för att referera till vad som är fel med denna ap Proach Kontrollera kommentarerna. UPDATERAD - baserat på Oli s kommentar inte säker på instabiliteten som han pratar om though. Use en sorterad karta över ankomsttider mot värden. När du anländer till ett värde lägg till ankomsttiden till den sorterade kartan tillsammans med den s Värda och uppdatera det rörliga genomsnittet. Varning det här är pseudokod. Det är inte helt fleshed ut men du får idén. Att notera Som jag sa ovanstående är pseudokoden Du måste välja en lämplig karta. Ta inte bort paren som Du iterera genom att du kommer att ogiltiggöra iteratorn och måste börja igen Se Oli s kommentar nedan also. answered Dec 15 11 på 12 22.This worksn t fungerar det tar inte hänsyn till vilken andel av fönstrets längd varje värde finns för också detta sätt att lägga till och sedan subtrahera är bara stabil för heltalstyper, inte floats oliver Charlesworth dec 15 11 på 12 29. oliCharlesworth - ledsen jag missade några viktiga punkter i beskrivningen dubbel och tidsvägd jag kommer att uppdatera tack dennis dec 15 11 vid 12 33. Tyngdpunkten är ännu ett problem Men det är inte vad jag pratar om. Jag hänvisade till det faktum att när ett nytt värde först kommer in i tidsfönstret, är dess bidrag till genomsnittet minimalt. Bidraget fortsätter att öka tills en nytt värde går in i Oliver Charlesworth Dec 15 11 på 12 35. Jag vet att detta kan uppnås med boost per per. Men jag vill verkligen undvika att använda boost jag har googled och inte hittat några lämpliga eller läsbara exempel. Basiskt vill jag spåra rörelsen genomsnittet av en pågående ström av en ström av flytande punktnummer med de senaste 1000 siffrorna som ett dataprov. Vilket är det enklaste sättet att uppnå detta. Jag experimenterade med att använda ett cirkulärt array, exponentiellt glidande medelvärde och ett enklare glidande medelvärde och fann att resultaten från den cirkulära gruppen passade mina behov best. asked 12 juni 12 på 4 38. Om dina behov är enkla kan du bara försöka använda ett exponentiellt rörligt medelvärde. Du gör bara en ackumulatorvariabel och som din torsk e tittar på varje prov, koden uppdaterar ackumulatorn med det nya värdet Du väljer en konstant alfa som är mellan 0 och 1 och beräknar detta. Du behöver bara hitta ett värde av alfa där effekten av ett visst prov endast varar för Ca 1000 prover. Jag är inte säker på att det här är lämpligt för dig nu när jag har lagt den här Problemet är att 1000 är ett ganska långt fönster för ett exponentiellt rörligt medelvärde. Jag är inte säker på att det finns en alfa som skulle sprida sig Medelvärdet över de senaste 1000 siffrorna, utan underflöde i flytpunktsberäkningen Men om du ville ha ett mindre medelvärde, som 30 nummer eller så, är det ett mycket enkelt och snabbt sätt att göra det. svarade 12 juni 12 på 4 44. 1 på ditt inlägg Det exponentiella glidande medlet kan låta alfabetet vara variabelt Så här tillåter det att det ska användas för att beräkna tidsbasen medelvärden, t. ex. bytes per sekund Om tiden sedan den senaste ackumulatoruppdateringen är mer än 1 sekund, låter du alfabetisk vara 1 0 Annars , du kan låta alfa vara usecs sedan senaste uppdatering 1000000 jxh Jun 12 12 på 6 21. Basiskt vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punktnummer med de senaste 1000 numren som ett dataprov. Notera att nedan uppdaterar summan som element som läggs till, undviker dyrt ON-traversal för att beräkna summan som behövs för genomsnittet - på begäran. Totala görs en annan parameter från T för att stödja t ex med en lång längd när det sammanhänger med 1000 långa s, ett int för char s eller en dubbel till totalt float S. Detta är lite fel i att numsamples kan gå förbi INTMAX - om du bryr dig att du kan använda en unsigned long long eller använda en extra bool data medlem att spela in när behållaren fylls först medan cykel nummor runt arrayen bäst omnämnde något oskyldig som pos. answered Jun 12 12 på 5 19.one antar att tomrumsoperatör T provet är faktiskt tomt operatör T prov oPless 8 juni 14 vid 11 52. oPless ahhh väl spotted egentligen menade jag att det skulle vara tomt operatör T prov men av Naturligtvis kan du använda whate Ver notation du gillade Kommer att fixa, tack Tony D Jun 8 14 på 14 27. Det är möjligt att genomföra ett glidande medelvärde i C utan att det behövs ett fönster i prov. Jag har funnit att jag kan optimera lite genom att välja ett fönster Storlek som är en kraft av två för att tillåta bitskiftning istället för att dela men inte behöva en buffert skulle vara trevligt. Finns det ett sätt att uttrycka ett nytt glidande medelresultat endast som en funktion av det gamla resultatet och det nya provet. Exempel på glidande medelvärde, över ett fönster med 4 prover att vara. Lägg till nytt prov eA glidande medelvärde kan implementeras rekursivt, men för en exakt beräkning av glidande medelvärde måste du komma ihåg det äldsta inmatningsprovet i summan dvs a i ditt exempel För en längd N rörligt medelvärde beräknar du. Där yn är utsignalen och xn är ingångssignalen. Eq 1 kan skrivas rekursivt som. Så du behöver alltid komma ihåg provet x nN för att beräkna 2.As påpekade av Conrad Turner, du kan använda ett oändligt långt exponentiellt fönster inste annonsen, som låter dig beräkna utmatningen endast från tidigare utmatning och nuvarande input. but detta är inte ett vanligt obetydligt rörligt medelvärde, men ett exponentiellt vägt rörligt medelvärde, där prov i det förflutna har en mindre vikt, men åtminstone i Teori du aldrig glömmer någonting, vikterna blir bara mindre och mindre för prover långt tidigare. Jag implementerade ett glidande medelvärde utan individuellt objektminne för ett GPS-spårprogram som jag skrev. Jag börjar med 1 prov och dela med 1 för att få nuvarande avg. Jag lägger sedan till ett exempel och delar upp med 2 till den nuvarande avg. This fortsätter tills jag kommer till längden av genomsnittet. Varje gång efteråt lägger jag till i det nya provet, får medelvärdet och tar bort det genomsnittet från totalt. Jag är inte en matematiker men det verkade som ett bra sätt att göra det. Jag tänkte att det skulle vända på magen på en riktig matte kille men det visar sig att det är en av de accepterade sätten att göra det och det fungerar bra. Kom bara ihåg att Öka längden desto långsammare är det följer efter vad du vill följa Det kan inte vara så mycket som helst, men när du följer satelliter, kan du vara långsiktig, om du är långsam, och det kommer att se dåligt ut. Du kan ha ett mellanrum mellan lördag och efterföljande prickar jag valde en längd på 15 uppdaterad 6 gånger per minut för att få tillräcklig utjämning och inte komma för långt från den faktiska lätta positionen med de släta spårpunkterna. svarade 16 november 16 vid 23 03.initialisera totalt 0, räkna 0 varje gång att se en nytt värde. Då läggs en inmatningsskanning, en lägger till totalt nyttValue, ett inkrementstal, en dela medelvärdet totalt. Detta skulle vara ett glidande medelvärde för alla inmatningar. För att beräkna medelvärdet över endast de sista 4 ingångarna, skulle det behöva 4 inputvariables, kanske Kopiera varje ingång till en äldre ingångsvariabel och sedan beräkna det nya glidande medlet som summan av de fyra ingångsvariablerna dividerat med 4 högerskift 2 skulle vara bra om alla ingångar var positiva för att göra den genomsnittliga beräkningen. Svarade 3 februari kl. 15 på 4 06. Det kommer faktiskt ca Lculate det totala genomsnittet och INTE det rörliga genomsnittet När räkningen blir större påverkas effekten av ett nytt ingångsprov liten Hilmar 3 feb kl 13:53. Ditt svar.2017 Stack Exchange, Inc.

Comments

Popular posts from this blog

Forex Handelstimmar Schema House

Bäst Forex Trading Software Mac

Show Att The Mean Of The Glidande Medelvärde