Thursday 16 November 2017

Veid Bevegelig Gjennomsnitt C Kode


Jeg prøver å beregne det bevegelige gjennomsnittet av et signal. Signalverdien (en dobbel) oppdateres i tilfeldige tider. Jeg ser etter en effektiv måte å beregne sitt tidsvektede gjennomsnitt på over et tidsvindu, i sanntid. Jeg kunne gjøre det selv, men det er mer utfordrende enn jeg trodde. De fleste av ressursene jeg har funnet over Internett, er å beregne glidende gjennomsnitt av periodisk signal, men mine oppdateringer tilfeldigvis. Kjenner noen gode ressurser til det? Tricket er det følgende: Du får oppdateringer i tilfeldige tider via ugyldig oppdatering (int time, float value). Men du må også spore når en oppdatering faller av tidsvinduet, så du stiller en alarm som kalles på tidspunktet N som fjerner den forrige oppdateringen, fra å bli vurdert på nytt i beregningen. Hvis dette skjer i sanntid, kan du be om at operativsystemet skal ringe til en metode som ikke lenger kan hentes fra tid til annen. N Hvis dette er en simulering, kan du ikke få hjelp fra operativsystemet, og du må gjør det manuelt. I en simulering vil du ringe metoder med tiden som følger med som et argument (som ikke korrelerer med sanntid). En rimelig forutsetning er imidlertid at anropene er garantert slik at tidsargumentene øker. I dette tilfellet må du opprettholde en sortert liste over alarmtidsverdier, og for hver oppdatering og leseanrop må du kontrollere om tidsargumentet er større enn hodet til alarmlisten. Mens det er større gjør du den alarmrelaterte behandlingen (slipp av den eldste oppdateringen), fjern hodet og kontroller igjen til alle alarmer før den angitte tiden behandles. Oppdater deretter oppdateringen. Jeg har så langt antatt at det er åpenbart hva du ville gjøre for den faktiske beregningen, men jeg vil utarbeide bare i tilfelle. Jeg antar at du har en metodeflottslest (int tid) som du bruker til å lese verdiene. Målet er å gjøre denne anrop så effektiv som mulig. Så du beregner ikke det bevegelige gjennomsnittet hver gang lesemetoden kalles. I stedet forkalkulerer du verdien som for den siste oppdateringen eller den siste alarmen, og justerer denne verdien ved hjelp av et par flytende punktoperasjoner for å regne for tidsforløpet siden den siste oppdateringen. (dvs. et konstant antall operasjoner bortsett fra kanskje å behandle en liste over oppstartede alarmer). Forhåpentligvis er dette klart - dette burde være en ganske enkel algoritme og ganske effektiv. Ytterligere optimalisering. Et av de gjenværende problemene er at hvis et stort antall oppdateringer skjer i tidsvinduet, så er det lang tid som det ikke finnes, eller oppdateringer, og deretter kommer en lesing eller oppdatering. I dette tilfellet vil ovennevnte algoritme være ineffektiv i trinnvis oppdatering av verdien for hver av oppdateringene som faller av. Dette er ikke nødvendig fordi vi bare bryr oss om den siste oppdateringen utover tidsvinduet, så hvis det er en måte å effektivt slippe av alle eldre oppdateringer, ville det hjelpe. For å gjøre dette kan vi endre algoritmen for å gjøre et binært søk med oppdateringer for å finne den nyeste oppdateringen før tidsvinduet. Hvis det er relativt få oppdateringer som må slettes, kan man trinnvis oppdatere verdien for hver oppdatert oppdatering. Men hvis det er mange oppdateringer som må slettes, kan man rekomputere verdien fra bunnen av etter å ha slått av de gamle oppdateringene. Tillegg om inkrementell beregning: Jeg bør klargjøre hva jeg mener med inkrementell beregning over i setningen justere denne verdien ved hjelp av et par flytende punktoperasjoner for å regne for tidsovergangen siden siste oppdatering. Innledende ikke-inkrementell beregning: deretter iterate over relevant oppdateringer i rekkefølge av økende tid: movingaverage (sum siste oppdatert timesincelastupdate) windowlength. Nå dersom nøyaktig en oppdatering faller av vinduet, men ingen nye oppdateringer kommer, juster summen som: (Merk at det er forhåndsdatat som har tidsstempel endret til begynnelsen av det siste vinduet som begynner). Og hvis akkurat en oppdatering kommer inn i vinduet, men ingen nye oppdateringer faller av, juster summen som: Som det skal være klart, er dette en grov skisse, men forhåpentligvis viser den hvordan du kan opprettholde gjennomsnittet slik at det er O (1) operasjoner per oppdatering på amortisert basis. Men vær oppmerksom på ytterligere optimalisering i forrige avsnitt. Legg også merke til stabilitetsproblemer som refereres til i et eldre svar, noe som betyr at flytpunktsfeil kan akkumulere over et stort antall slike inkrementelle operasjoner slik at det er en avvik fra resultatet av den fullstendige beregningen som er viktig for applikasjonen. Hvis en tilnærming er OK, og det er en minimal tid mellom prøver, kan du prøve superprøving. Har en matrise som representerer jevnt fordelte tidsintervaller som er kortere enn minimumet, og i hver tidsperiode lagrer du den siste prøven som ble mottatt. Jo kortere intervallet, jo nærmere gjennomsnittet blir den sanne verdien. Perioden bør ikke være større enn halvparten av minimumet, eller det er en sjanse for å mangle en prøve. svarte des 15 11 kl 18:12 svarte des 15 11 kl 22:38 Takk for svaret. En forbedring som ville være nødvendig for å faktisk citerer verdien av det totale gjennomsnittet, slik at vi ikke slår hele tiden. Det kan også være et mindre punkt, men det ville ikke være mer effektivt å bruke en deque eller en liste for å lagre verdien, siden vi antar at oppdateringen kommer i riktig rekkefølge. Innsetting vil være raskere enn i kartet. ndash Arthur Dec 16 11 at 8:55 Ja, du kan cache verdien av summen. Trekk verdiene av prøvene du sletter, legg til verdiene av prøvene du legger inn. Også, en dequeltpairltSample, Dategtgt kan være mer effektiv. Jeg valgte kart for lesbarhet, og det enkle å påkalle kart :: overgående. Som alltid, skriv riktig kode først, og profil og måle trinnvise endringer. ndash Rob Dec 16 11 kl 15:00 Merk: Dette er tilsynelatende ikke veien til å nærme seg dette. Leaving det her for referanse om hva som er galt med denne tilnærmingen. Sjekk kommentarene. OPPDATERT - basert på Olis kommentar. Ikke sikker på om ustabiliteten han snakker om skjønt. Bruk et sortert kart over ankomsttider mot verdier. Ved ankomst av verdi legger du ankomsttid til det sorterte kartet sammen med verdien og oppdaterer glidende gjennomsnitt. advarsel dette er pseudokode: der. Ikke helt fleshed ut, men du får ideen. Ting å merke seg. Som jeg sa ovenfor er pseudokoden. Du må velge et passende kart. Ikke ta av parene ettersom du gjennomfører det, da du vil ugyldiggjøre iteratoren og må starte på nytt. Se Olis kommentar nedenfor også. besvart 15. desember kl 12:22 Dette virker ikke: det tar ikke hensyn til hvilken andel av vinduslengden hver verdi eksisterer for. Også denne tilnærmingen til å legge til og deretter subtrahere er bare stabil for heltalltyper, ikke flyter. ndash Oliver Charlesworth Dec 15 11 at 12:29 OliCharlesworth - beklager jeg savnet noen viktige punkter i beskrivelsen (dobbelt og tidsvektet). Jeg vil oppdatere. Takk. ndash Dennis Dec 15 11 at 12:33 Tidsvekten er enda et problem. Men det er ikke det jeg snakker om. Jeg refererte til det faktum at når en ny verdi først kommer inn i tidsvinduet, er dets bidrag til gjennomsnittet minimalt. Dens bidrag fortsetter å øke inntil en ny verdi går inn. ndash Oliver Charlesworth Dec 15 11 at 12:35 Jeg vet at dette er mulig 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 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 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 er 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 addreplaced, unngå kostbare O (N) traversal å beregne summen som trengs for gjennomsnittet - on demand. 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 14: 27moving gjennomsnitt s teknikker høyfrekvent trading targetblank MA flytte gjennomsnittlig s teknikker høyfrekvent handel Adaptive flytte gjennomsnittlige teknikker, CSI 300 indeks futures høyere frekvens databehandling, for å oppnå simulert handel. Bli med gevinster Visual, lett å studere, identifisere markedsmuligheter, fange handelsmuligheter, endringer i sanntidsstrategi for å oppnå maksimale gevinster. Men handelsskilt. bevegelige gjennomsnitt s teknikker høyfrekvent handel målblank bevegelige gjennomsnitt s teknikker høyfrekvent handel targetblank flytte AVG filter targetblank finne Terskel ved å flytte AVG filter denne metoden som brukes for å finne beste Terskel i bilde med flytende avrage filter denne metoden som brukes i bildebehandling og brukes til skygge soloution kode og resultat er vedlagt i mappen du brukte og sett dette resultattankene for ditt nettsted amin tolou nb. flytte AVG filter targetblank flytte AVG filter targetblank bevegelige ledde displaymatris targetblank bevegelige LED display matriseprogrammering av 8051 microcontroller ved hjelp av AT89S51 der en flyttende melding vises på leddmatrise. bevegelse ledd skjermmatrise targetblank bevegelse ledd skjermmatrise targetblank flytting Bilprojekt targetblank flytting Bilprosjekt Dette er et java-prosjekt hvor en bil beveger seg fra høyre til venstre ved å senke generell sti med 60 enheter som beskriver at bil - og flashbelysningstjerner med polygon objekt som en matrise fra grått til gult med svart bakgrunn ved å bruke malingsmetode og tegne vei som rektangel med grå farge. flytting Bilprosjekt målblank bevegelse Bilprosjekt målblank vektet medianfilter targetblank vektet medianfilter vektet Medianfilter: Det er det samme som medianfilter, bare forskjellen er at masken ikke er tom. Det vil ha litt vekt (eller verdier) og gjennomsnitt d. Fremgangsmåten for å utføre vektet medianfiltrering er som følger: 1) Anta en 3x3 vektet maske. 2) Legg masken til venstre. vektet medianfilter targetblank vektet medianfilter targetblank glidende gjennomsnitt Filter targetblank glidende gjennomsnitt Filtreringsfunksjon kalles ved å gi den nødvendige innmatningen, for eksempel bildet leses av imread () eller kan være en enkel vektor dannet av en lydfil eller data fra en hvilken som helst annen kilde. Sammen med inngangen må funksjonen leveres med vinduets marginer, dvs. M1 og M2, som brukes i funksjon til av. glidende gjennomsnitt Filterrullblank glidende gjennomsnitt Filtermålblank gjennomsnitt Filter eller Mask målblank gjennomsnitt Filter eller Mask Gjennomsnittlig filter, eller gjennomsnittlig filter er windowed filter av lineær klasse, som jevner signalet (bildet). Filteret fungerer som lavpass en. Den grunnleggende ideen bak filteret er for ethvert element av signalet (bildet) et gjennomsnitt over hele nabolaget. For å forstå hvordan det gjøres i praksis, la oss s. gjennomsnittlig Filter eller Mask targetblank gjennomsnittlig Filter eller Mask targetblank flytting t-Test Teknikk targetblank flytting t-Test Teknikk Variabilitetsdiagnose av tidssekvens trendanalyse. flytting t-Test Teknikk targetblank flytting t-Test Teknikk targetblank eksponensiell fordeling av pakkelengdegenerator targetblank Antallet pakker generert Poisson distribusjon med eksponentiell distribusjon av pakkelengdegenerator Selv skrev lite program, inkludert kommunikasjonssystem FIFO-kø av programmet, og antall pakker generert Poisson distribusjon med eksponentiell distribusjon av pakkelengdegenerator, helt praktisk. eksponentiell distribusjon av pakkelengdegenerator targetblank eksponensiell distribusjon av pakkelengdegenerator targetblank Forlenget: 25.337ms - init: 0.7b: 1.5r: 24.9 5.199 CodeForge Kinesisk versjon CodeForge Engelsk versjon Hvor skal du Gå til CodeForge brukercenter Fullfør profilen din, få poeng 8 Sek Stay her Ups. Beklager, denne fyren er mystisk, bloggen sin har ikke blitt åpnet, prøv en annen, vær så snill, OKIs det mulig å implementere et bevegelige gjennomsnitt i C uten behov for et vindu med prøver. Jeg har funnet at jeg kan optimalisere litt ved å velge en vindusstørrelse som er en kraft av 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 å kunne 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 delt gjennomsnitt (totalt antall) Dette ville være et glidende gjennomsnitt over alle innganger For å beregne gjennomsnittet over bare de siste 4 inngangene, ville det kreve 4 inputvariables, kanskje kopiering av hvert inngang til en eldre inputvariable, og deretter beregning av det nye glidende gjennomsnittet. Som summen av de 4 inngangsvariablene delt på 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

No comments:

Post a Comment