Sunday 5 November 2017

Flytting Gjennomsnitt Kode I C


Er det mulig å implementere et bevegelige gjennomsnitt i C uten at det er behov for et vindu med prøver Ive har funnet ut at jeg kan optimalisere litt ved å velge en vindustørrelse som er en kraft på to for å tillate bitforskyvning i stedet for å dele, men ikke trenger en buffer ville være hyggelig. Er det en måte å uttrykke et nytt glidende gjennomsnittsresultat bare som en funksjon av det gamle resultatet og den nye prøven. Definer et eksempel glidende gjennomsnitt, over et vindu på 4 prøver å være: Legg til ny prøve e: Et glidende gjennomsnitt kan implementeres rekursivt , men for en nøyaktig beregning av det bevegelige gjennomsnittet må du huske den eldste innsatsprøven i summen (dvs. a i eksempelet ditt). For et lengde N bevegelige gjennomsnitt beregner du: hvor yn er utgangssignalet og xn er inngangssignalet. Eq. (1) kan skrives rekursivt som Så du må alltid huske prøven xn-N for å beregne (2). Som påpekt av Conrad Turner, kan du bruke et (uendelig langt) eksponensielt vindu i stedet, som gjør det mulig å beregne utgangen bare fra tidligere utgang og gjeldende inngang: men dette er ikke et standard (uvevet) glidende gjennomsnitt, men eksponentielt vektet glidende gjennomsnitt, hvor prøver tidligere i det siste får en mindre vekt, men (i det minste i teorien) glemmer du aldri noe (vektene blir bare mindre og mindre for prøver langt i det siste). Jeg implementerte et glidende gjennomsnitt uten individuelt elementminne for et GPS-sporingsprogram jeg skrev. Jeg starter med 1 prøve og deler med 1 for å få dagens avg. Jeg legger til en prøve og deler med 2 til den nåværende avg. Dette fortsetter til jeg kommer til lengden av gjennomsnittet. Hver gang etterpå legger jeg til den nye prøven, får gjennomsnittet og fjerner det gjennomsnittet fra totalen. Jeg er ikke en matematiker, men dette virket som en god måte å gjøre det på. Jeg skjønte at det ville slå magen til en ekte matte fyr, men det viser seg at det er en av de aksepterte måtene å gjøre det på. Og det fungerer bra. Bare husk at jo høyere lengden jo tregere følger det du vil følge. Det kan ikke være noe som helst mesteparten av tiden, men når du følger satellitter, hvis du er treg, kan stien være langt fra den faktiske posisjonen, og det vil se dårlig ut. Du kan ha et mellomrom mellom lørdager og de etterfølgende prikkene. Jeg valgte en lengde på 15 oppdatert 6 ganger i minuttet for å få tilstrekkelig utjevning og ikke komme for langt fra den faktiske lette stillingen med glattestrekpunktene. besvart 16 nov 16 kl 23:03 initialiser totalt 0, count0 (hver gang vi ser en ny verdi) En innskriving (scanf), en legger til totalnewValue, ett inkrement (telle), en del av gjennomsnitt (totalt antall) Dette ville være et bevegelige gjennomsnitt over alle innganger For å beregne gjennomsnittet over bare de siste 4 inngangene, ville det kreve 4 inngangsvariabler, kanskje kopiering av hvert inngang til en eldre inputvariable og deretter beregning av det nye glidende gjennomsnittet. Som summen av de 4 inngangsvariablene delt med 4 (høyre skift 2 ville være bra hvis alle inngangene var positive for å gjøre gjennomsnittlig beregning besvart 3. februar klokken 4:06 som faktisk vil beregne gjennomsnittet og IKKE det bevegelige gjennomsnittet. Etter hvert som tellingen blir større, blir virkningen av en ny inngangsprøve forsvunnet liten ndash Hilmar Feb 3 15 kl 13:53 Ditt svar 2017 Stack Exchange, Inc Jeg vet at dette kan oppnås med boost per: Men jeg vil virkelig unngå å bruke boost. Jeg har googled og ikke funnet noen egnede eller lesbare eksempler. I utgangspunktet vil jeg spore flytting gjennomsnitt av en pågående strøm av en strøm av flytende punktnumre ved å bruke de siste 1000 tallene som en dataprøve. Hva er den enkleste måten å oppnå dette på, jeg eksperimenterte med å bruke et sirkulært array, eksponentielt glidende gjennomsnitt og et enklere glidende gjennomsnitt og fant ut at resultatene fra det sirkulære arrayet passer mine behov best. spurte 12. juni kl 12:38 Hvis dine behov er enkle, kan du bare prøve å bruke et eksponentielt glidende gjennomsnitt. Enkelt sagt, du lager en akkumulatorvariabel, og når koden ser på hver prøve, oppdaterer koden akkumulatoren med den nye verdien. Du velger en konstant alfa som er mellom 0 og 1, og beregner dette: Du trenger bare å finne en verdi av alfa hvor effekten av en gitt prøve bare varer i ca 1000 prøver. Hmm, jeg er egentlig ikke sikker på at dette passer for deg, nå som jeg har sagt det her. Problemet er at 1000 er et ganske langt vindu for et eksponentielt glidende gjennomsnitt. Jeg er ikke sikker på at det finnes en alfa som vil spre gjennomsnittet over de siste 1000 tallene, uten understrøm i flytpunktsberegningen. Men hvis du vil ha et mindre gjennomsnitt, som 30 tall eller så, er dette en veldig enkel og rask måte å gjøre det på. svarte 12. juni kl 12:44 1 på ditt innlegg. Det eksponentielle glidende gjennomsnittet kan la alfa variere. Så dette tillater det å bli brukt til å beregne tidsbasen gjennomsnitt (for eksempel bytes per sekund). Hvis tiden siden den siste akkumulatoroppdateringen er mer enn 1 sekund, lar du alfa være 1,0. Ellers kan du la alpha være (usecs siden sist oppdatering1000000). ndash jxh Jun 12 12 at 6:21 I utgangspunktet vil jeg spore det bevegelige gjennomsnittet av en pågående strøm av en strøm av flytende punktnumre ved å bruke de siste 1000 tallene som en datasample. Vær oppmerksom på at under oppdateringer summen som elementer som addrested, unngå kostbare O (N) traversal å beregne summen som trengs for gjennomsnittet - på forespørsel. Totalt er det laget en annen parameter fra T for å støtte f. eks. bruker en lang lang når totalt 1000 lang s, en int for char s, eller en dobbel til total float s. Dette er litt feil i at numsamples kan gå forbi INTMAX - hvis du bryr deg om at du kan bruke en usignert lang lang. eller bruk et ekstra bool data medlem til å registrere når beholderen først fylles mens sykkel nummeprøver rundt arrayet (best deretter omdøpt noe uskyldig som pos). besvart 12. juni 12 klokka 5:19 en antar at kvote-operatør (T-prøve) kvot er faktisk quotvoid operatorltlt (T-prøve) sitat. ndash oPless 8 Jun 14 kl 11:52 oPless ahhh. godt observert. egentlig mente jeg at det skulle være tomt operatør () (T-prøve), men selvfølgelig kunne du bruke hvilken som helst notasjon du likte. Vil fikse, takk. ndash Tony D Jun 8 14 at 14:27 Jeg har 4000 mengder data på lager og tring for å beregne det bevegelige gjennomsnittet for alle dataverdier, men siden det bevegelige gjennomsnittet er basert på tidligere data, og jeg kan ikke beregne 15-dagers SMA for de første 14 dagene, hopp over de første 14 dagene og beregne SMA på resten av dataene. Og det er å bruke LINQ for å oppnå. Kan noen gi en prøve eller en hint om hvordan du bruker LINQ til å beregne glidende gjennomsnitt Utgangen for gjennomsnittsverdiene er rundt 500, jeg forstår egentlig ikke hvordan det er mulig å få den høye verdien. Flytting gjennomsnittsdanner med summer matrise: 06072012 562,49 571,72 06082012 565,84 580,32 06112012 568,56 571,17 06122012 569,55 576,16 06132012 570,56 572,16 06142012 570,63 571,53 06152012 571,21 574,13 06182012 572,78 585,78 06192012 573,79 587,41 06202012 574,23 585,74 06212012 574,22 577,67 06222012 575,63 582,10 06252012 576,06 570,77 06262012 576,68 572,03 06272012 576,88 574.50 06282012 576.7 569.05 06292012 576.95 584.00 07022012 578.37 592.52 07032012 579.92 599.41 07032012 581.74 599.41 Redigert av Leemx Fredag ​​16. november 2012 2:59 Flyttet av Lisa Zhu Microsoft kontingentpersonal Mandag 19. november 2012 07:38 linq relatert (Fra : Visual C General) Fredag ​​16. november 2012 2:42 For å skape et glidende gjennomsnitt, begynner jeg å lage en rekkevidde fra 0 til (lengden på datalisten - lengden på bevegelige periode), deretter for hver verdi i området velg elementer x til x 43 lengden på bevegelige periode og beregne gjennomsnittet. Alt i en fin LINQ-setning: Vær oppmerksom på at dette ikke er ekstremt effektivt, siden du i utgangspunktet lytter over datalisten for hver verdi i serien. Hei, se Dette systemet tillater signaturer på mer enn 60 cha Redigert av Arno Brouwer Fredag, november 23, 2012 4:42 PM Merket som svar av Alexander Sun Fredag, 07 desember 2012 2:44 AM fredag ​​23. november 2012 kl. 16:41 Alle svar Et eksempel på LINQ-setningen din vil hjelpe. quotPremature optimalisering er roten til alt ondt. Quot - Knuth For å opprette et bevegelige gjennomsnitt, ville jeg begynne med å skape et område fra 0 til (lengden på datalisten - lengden på bevegelighetsperioden), og deretter for hver verdi i rekkevidden velg elementer x til x 43 lengden på bevegelige periode og beregne gjennomsnittet. Alt i en fin LINQ-setning: Vær oppmerksom på at dette ikke er ekstremt effektivt, siden du i utgangspunktet lytter over datalisten for hver verdi i serien. Hei, se Dette systemet tillater signaturer på mer enn 60 cha Redigert av Arno Brouwer Fredag, november 23, 2012 4:42 PM Markert som svar av Alexander Sun Fredag ​​07. desember 2012 2:44 AM 23. november 2012 kl. 16:41 Microsoft gjennomfører en online-undersøkelse for å forstå din mening på Msdn-nettsiden. Hvis du velger å delta, vil onlineundersøkelsen bli presentert for deg når du forlater nettstedet Msdn. Vil du delta? Hjelp oss med å forbedre MSDN. Besøk vår UserVoice-side for å sende inn og stemme på ideer Dev-sentre LæringsressurserAndreSimple glidende gjennomsnitt GjennomsnittSimple glidende gjennomsnitt Du oppfordres til å løse denne oppgaven i henhold til oppgavebeskrivelsen, ved hjelp av hvilket som helst språk du kanskje kjenner. Beregner det enkle glidende gjennomsnittet av en rekke tall. Opprett en stateful funksjonsklasseinstans som tar en periode og returnerer en rutine som tar et tall som argument og returnerer et enkelt bevegelige gjennomsnitt av sine argumenter så langt. Et enkelt glidende gjennomsnitt er en metode for å beregne et gjennomsnitt av en strøm av tall ved å bare gjennomsnitts de siste 160 P 160 tallene fra strømmen, 160 hvor 160 P 160 er kjent som perioden. Det kan implementeres ved å kalle en initialiseringsrutine med 160 P 160 som argument 160 I (P) 160, som deretter skal returnere en rutine som når det kalles med individuelle suksessive medlemmer av en strøm av tall, beregner gjennomsnittet av (opp til), de siste 160 P 160 av dem, lar vi ringe denne 160 SMA (). Ordet 160 stateful 160 i oppgavebeskrivelsen refererer til behovet for 160 SMA () 160 for å huske visse opplysninger mellom samtaler til den: 160 Perioden, 160 P 160 En bestilt beholder med minst de siste 160 P 160 tallene fra hver av sine individuelle samtaler. Statlig 160 betyr også at etterfølgende samtaler til 160 I (), 160 initialisereren, 160 skal returnere separate rutiner som gjør 160 ikke 160 delte lagrede tilstander, slik at de kan brukes på to uavhengige datastrømmer. Pseudo-kode for en implementering av 160 SMA 160 er: Denne versjonen bruker en vedvarende kø for å holde de nyeste p-verdiene. Hver funksjon som returneres fra init-moving-gjennomsnittet har sin tilstand i et atom som holder en køverdi. Denne implementeringen bruker en sirkulær liste for å lagre tallene i vinduet ved begynnelsen av hver iterasjonspeker refererer til listecellen som holder verdien bare flyttet ut av vinduet og erstattes med den verdiskapende verdien. Bruke en Closure-redigering For øyeblikket kan denne sma ikke være nok fordi den tildeler en lukning på bunken. Noen rømningsanalyser kan fjerne heapfordelingen. Bruke en Struktur-redigering Denne versjonen unngår brønnallokering av lukkingen som holder dataene i stakkrammen til hovedfunksjonen. Samme utgang: For å unngå at floating point-tilnærmingene fortsetter å vokse opp og vokse, kan koden utføre en periodisk sum på hele sirkulær køarrangementet. Denne implementeringen produserer to (funksjon) objekter delingstilstand. Det er idiomatisk i E for å skille inngang fra utgang (les fra skriv) i stedet for å kombinere dem til en gjenstand. Strukturen er den samme som implementeringen av Standard DeviationE. Eliksirprogrammet nedenfor genererer en anonym funksjon med en innebygd periode p, som brukes som perioden for det enkle glidende gjennomsnittet. Kjøringsfunksjonen leser numerisk inngang og overfører den til den nyopprettede anonyme funksjonen, og kontrollerer deretter resultatet til STDOUT. Utgangen vises nedenfor, med gjennomsnittet, etterfulgt av gruppert inngang, som danner grunnlaget for hvert glidende gjennomsnitt. Erlang har nedleggelser, men uutviklede variabler. En løsning er da å bruke prosesser og en enkel melding som passerer basert API. Matrix-språk har rutiner for å beregne glidningsavstandene for en gitt rekkefølge av elementer. Det er mindre effektivt å sløyfe som i følgende kommandoer. Fortløpende ber om en inngang I. som legges til enden av en liste L1. L1 kan bli funnet ved å trykke på 2ND1, og det finnes gjennomsnitt i ListOPS Trykk ON for å avslutte programmet. Funksjon som returnerer en liste som inneholder gjennomsnittlig data for det medfølgende argumentet Program som returnerer en enkel verdi ved hver påkalling: listen er listen som gjennomsnitt: p er perioden: 5 returnerer gjennomsnittslisten: Eksempel 2: Bruke programmet movinav2 (jeg , 5) - Initialisere glidende gjennomsnittlig beregning, og definer periode på 5 movinav2 (3, x): x - nye data i listen (verdi 3), og resultatet lagres på variabel x og vises movinav2 (4, x) : x - nye data (verdi 4), og det nye resultatet blir lagret på variabel x, og vises (43) 2. Beskrivelse av funksjonen movinavg: variabel r - er resultatet (gjennomsnittslisten) som vil bli returnert variabel i - er indeksvariabelen, og den peker mot slutten av underlisten listen er i gjennomsnitt. variabel z - en hjelpesvariabel Funksjonen bruker variabel i for å bestemme hvilke verdier av listen som skal vurderes i neste gjennomsnittlige beregning. Ved hver iterasjon peker variabel jeg på den siste verdien i listen som vil bli brukt i gjennomsnittlig beregning. Så vi trenger bare å finne ut hvilken vil være den første verdien i listen. Vanligvis må du vurdere p-elementer, så det første elementet vil være det som er indeksert av (i-p1). Men ved de første iterasjonene vil denne beregningen vanligvis være negativ, slik at følgende ligning vil unngå negative indekser: maks (i-p1,1) eller, ordne ekningen, maks (i-p, 0) 1. Men antall elementer på de første iterasjonene vil også være mindre, den riktige verdien vil være (sluttindeks - startindeks 1) eller, ordne ligningen, (i - (maks (ip, 0) 1) 1) og deretter , (i-max (ip, 0)). Variabel z har den vanlige verdien (max (ip), 0) slik at begynnelsesindeksen vil være (z1) og tallfeltene vil være (iz) midt (liste, z1, iz) returnere listen over verdi som vil være gjennomsnittlig sum .) vil summe dem sum (.) (iz) ri vil gjennomsnittlig dem og lagre resultatet på riktig sted i resultatlisten fp1 oppretter en delvis applikasjon som fastsetter (i dette tilfellet) andre og tredje parametere

No comments:

Post a Comment