Jag vet att detta kan uppnås med boost enligt: Men jag vill verkligen undvika att använda boost. Jag har googled och inte hittat några lämpliga eller läsbara exempel. I grund och botten vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punkttal med de senaste 1000 siffrorna som ett dataprov. Vad ä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 bäst. frågade 12 juni 12 kl 4:38 Om dina behov är enkla kan du bara försöka använda ett exponentiellt glidande medelvärde. Enkelt du skapar en ackumulatorvariabel, och när din kod tittar på varje prov uppdateras koden med 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 cirka 1000 prover. Hmm, 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 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 här ett mycket enkelt och snabbt sätt att göra det. svarade 12 jun 12 kl 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 används för att beräkna tidsbaserade medelvärden (t ex byte per sekund). Om tiden sedan den senaste ackumulatorns uppdatering är mer än 1 sekund, låter du alpha vara 1,0. Annars kan du låta alpha vara (usecs sedan senaste uppdateringen1000000). ndash jxh Jun 12 12 at 6:21 I grund och botten vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punkttal med de senaste 1000 siffrorna som ett dataprov. Observera att nedanstående uppdaterar summan som element som läggs ut och undviker kostsam O (N) - korsning för att beräkna summan som behövs för genomsnittet - efterfrågan. Totalt görs en annan parameter från T för att stödja t. ex. använder en lång lång när totalt 1000 lång s, ett int för char s, eller en dubbel till totalt float s. Det här är lite bristfälligt i att numsamples kan gå förbi INTMAX - om du bryr dig att du kan använda en unsigned long long. eller använd en extra bool-data medlem för att spela in när behållaren fylls först medan cykeltalsprover runt arrayen (bäst omnämndes något oskadd som pos). svarade den 12 juni 12 på 5:19 en förutsätter att kvoträttsoperatören (T-provet) kvot är faktiskt kvittooperatör (T-prov) citat. ndash oPless 8 juni 14 kl 11:52 oPless ahhh. välspotted. egentligen menade jag att det skulle vara tomt operatör () (T-prov) men självklart kunde du använda vilken anteckning du gillade. Kommer att fixa, tack. ndash Tony D Jun 8 14 at 14:27 Det är möjligt att genomföra ett glidande medelvärde i C utan att det behövs ett fönster i prover. Jag har funnit att jag kan optimera lite, genom att välja en fönsterstorlek som är en kraft av två för att tillåta lite - förskjutning istället för att dela men behöver inte buffert 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 Definiera ett exempel glidande medelvärde, över ett fönster med 4 prov att vara: Lägg till nytt prov e: Ett glidande medel kan implementeras rekursivt , men för en exakt beräkning av det rörliga genomsnittet måste du komma ihåg det äldsta inmatningsprovet i summan (dvs a i ditt exempel). För ett längd N rörligt medelvärde beräknar du: var yn är utsignalen och xn är ingångssignalen. Eq. (1) kan skrivas rekursivt som Så du behöver alltid komma ihåg provet xn-N för att beräkna (2). Som påpekat av Conrad Turner kan du använda ett (oändligt långt) exponentiellt fönster istället, vilket gör det möjligt att beräkna utmatningen endast från tidigare utmatning och aktuell ingång: men detta är inte ett vanligt (obetydligt) glidande medelvärde men exponentiellt viktat glidande medelvärde, där prov i det förflutna får en mindre vikt, men (åtminstone teoretiskt) glömmer du aldrig någonting (vikterna blir bara mindre och mindre för prover långt ifrån). Jag implementerade ett glidande medelvärde utan individuellt objektminne för ett GPS-spårningsprogram som jag skrev. Jag börjar med 1 prov och dela med 1 för att få nuvarande avg. Sedan lägger jag till ett prov och delar upp med 2 till den nuvarande avg. Detta fortsätter tills jag når längden på medelvärdet. Varje gång efteråt lägger jag till i det nya provet, får medelvärdet och tar bort det genomsnittet från summan. Jag är inte 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 ett av de accepterade sätten att göra det. Och det fungerar bra. Kom bara ihåg att ju högre längden desto långsammare följer du vad du vill följa. Det kan inte ha betydelse för det mesta, men när du följer satelliter, kan du vara långsiktig, om det är långt ifrån det faktiska läget och det kommer att se dåligt ut. Du kan få ett mellanrum mellan mitten och de efterföljande prickarna. 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. svarat 16 november 16 kl 23:03 initialisera totalt 0, count0 (varje gång vi ser ett nytt värde) Då en inmatning (scanf), en lägg till totalnevValue, en ökning (räkning), en delningsgenomsnitt (totalantal) Detta skulle vara ett glidande medelvärde över alla ingångar För att beräkna medelvärdet över endast de fyra sista ingångarna, skulle det behöva 4 ingångsvariabler, kanske kopiering av varje ingång till en äldre ingångsvariabel och sedan beräkning av det nya glidande medlet. Som summan av de fyra ingångsvariablerna dividerat med 4 (höger skift 2 skulle vara bra om alla ingångar var positiva för att göra den genomsnittliga beräkningen besvarad 3 feb 15 kl 4:06 som faktiskt kommer att beräkna det totala genomsnittet och INTE det glidande genomsnittet. När räkningen blir större blir effekten av ett nytt ingångsprov försvinnande liten ndash Hilmar Feb 3 15 kl 13:53 Ditt svar 2017 Stack Exchange, IncC-algoritm för exponential glidande medelvärde för noll-latens Senast ändrad: 2012-08-13 Jag har försökt att implementera en lågfrekvens cutoff i c som i huvudsak tar en ström av siffror och smoo ths ut utgången (filtrering ut högfrekvent rörelsejitter), men det är viktigt att de främre viktiga numren anses omedelbart eftersom data är tidskritisk (det är att styra en rörelsesimulationsbas med utgång från lite spelprogram). Jag har en arbetsviktad glidande genomsnittlig algoitm men kunde göra med något lite mer responsivt i frontänden, och jag hittade det här: - Pseudokoden finns som följer: Ingångar: Pris (NumericSeries), Period (NumericSimple) Variabler: faktor (0), fördröjning (0) om CurrentBar lt 1 börjar ZLEMA Prisfaktor 2 (Period1) fördröjning (Period 1) 2 äntligen börjar ZLEMA-faktor (2Price-Pricelag) (1-faktor) ZLEMA1 ände Ive översatt den till C och min kod är som följer: Det verkar dock inte som att jag förväntar mig. Det verkar vara nästan där men ibland får jag ett något lägre värde än alla föremål i kön (när de är alla högre). Min kö och antalet poster i den skickas som parametrar, med den senaste som alltid är framåt, jag passerar också en inkrementär räknare som börjar vid 0 som krävs av funktionen. Jag är inte säker på att jag har tolkat betydelsen av ZLEMA1 korrekt eftersom det inte är tydligt i sin pseudokod, så jag antog att detta var de sista samtalen zlema och även Im antar att Pris betyder faktiskt Price0. Kanske har jag det här felet Jag skulle kopiera de faktiska zlemaberäknade värdena tillbaka till min ursprungliga kö innan nästa samtal jag ändrar inte den ursprungliga köen på alla andra än att bara flytta alla värden ett till slutet och sätta in det senaste i början . Koden som jag använder för att göra detta är: Skulle vara mycket tacksam om någon med en bättre förståelse av matematiken skulle kunna behaga sanity kontrollera det här för att jag ska se om jag har något lite fel Tack så mycket i förväg om du kan hjälpa För det första tacka allt för Din insats, mycket uppskattad Det är meningslöst att jag antar att det bästa jag kan hoppas på är helt enkelt ett exponentiellt glidande medelvärde. Att acceptera att det kommer att finnas en liten fördröjning, men detta kommer att minimeras av den tyngre frontviktningen än den som anges i typviktad glidande medelvärde Jag har även denna algoritm, men ett liknande problem med att värdena inte verkar riktigt korrekta (om inte detta är formens natur). Till exempel, säg att mitt sortiment innehåller 16 värden, alla 0,4775 - utmatningen är 0.4983, men Id förväntar att det blir 0,4775 Ser det här ut med dig. Exponentiell rörlig medelvärde. float ema (float vals, int numVals, int currentSample) statisk floatfaktor 0 statisk float lastema 0 float ema if (currentSample lt 1) ema vals0 faktor 2.0 ((float) numVals) 1,0) annars ema (faktor vals0) - faktor) lastema) lastema ema return ema Omvänt är utsignalen ibland lägre än var och en av ingångarna, även om alla är högre. Den kallas på samma sätt som zlema (.) Ovan, med en inkrementell räknare. Formeln och pseudokoden för den här är här: - autotradingstrategy. wordpress20091130exponential-moving-average Tack igen, ursäkta för mitt missförstånd om några av grunderna :( Med vänliga hälsningar, Chris J När det gäller koden jag skrev upp, har du rätt om matrisstorleken Situationen. Det bör lätt lösas. Vad gäller dina frågor: 1) Filterkonstanten representerar en frekvensavbrott. Jag använde en digital signalbehandling (DSP) för denna teknik. en. wikipedia. orgwi kiLow-pas sfilter är en enkel förklaring. Du vill ha sektionen för diskret tid. I mitt fall är A den RC-Constant som de talar om. Så frekvensen som den skär ut är över 1 (2piA). Om du inte har en förståelse för frekvensdomänteori kan detta bli komplicerat. I ditt fall, Ju högre du gör A, desto lägre frekvens kommer det här filtret att tillåta, vilket betyder att det kommer att jämna ut kurvan mer och mer. Ju lägre du gör det desto mer ljud är det tillåtet i systemet. Kom ihåg att ett måste vara större än eller lika med 1 för att vara effektivt. Jag satte igen XLS igen, den här gången utan att ändra rand () tal. Justera A-konstanten och se hur den quotsmoothsquot (eller filter) utger högfrekvensvariationerna. 2) Den sista punkten i ingångsarrayen har det senaste värdet. 3) Detsamma gäller för utmatningsraden. Det sista är det senaste värdet. 5) NUMVALS är godtycklig. Du kan kontinuerligt lägga till inmatnings - och utmatningsuppsättningen så många gånger som du gillar och det skulle inte effekta filtret. I synnerhet använde jag 49 poäng. Men jag kan enkelt ta bort de senaste 20 och de första 29 utgångarna skulle förbli densamma. Funktionen är inte baserad på hur många poäng som används. Jag skulle vilja nämna att jag utvecklade denna funktion för en engångskonvertering. Om du ville göra en omvandling till nästa värde i flygningen kunde du prova något enklare (som bifogat). Återigen är jag rostig på c. Jag hoppas att det här är rätt. Det enda du behöver leverera är inmatningen och filterkonstanten. Låt mig veta om detta hjälper.
No comments:
Post a Comment