Ek probeer om die bewegende gemiddelde van 'n sein te bereken. Die sein waarde ( 'n dubbel) is opgedateer na willekeur keer. Ek is op soek na 'n doeltreffende manier om sy tyd geweegde gemiddelde oor 'n tyd venster te bereken, in real time. Ek kon dit doen my self, maar dit is meer uitdagend as wat ek gedink het. Die meeste van die hulpbronne Ive gevind oor die internet is die berekening van bewegende gemiddelde van periodieke sein, maar my updates na willekeur tyd. Is daar iemand weet goed hulpbronne vir daardie Die truuk is die volgende: Jy kry updates na willekeur keer per leemte update (int tyd, float waarde). Maar jy moet ook ook dop wanneer 'n update val af die tyd venster, sodat jy 'n alarm wat genoem ten tye N wat die vorige update van wat ooit in die berekening weer oorweeg verwyder gestel. As dit gebeur in real-time kan jy die bedryfstelsel versoek om 'n oproep om 'n metode leemte dropoffoldestupdate (int tyd) genoem te word ten tye N As dit 'n simulasie, kan jy nie die hulp van die bedryfstelsel te kry en wat jy nodig het om die hand te doen nie. In 'n simulasie sal jy metodes met die verskaf as 'n argument (wat nie ooreenstem met die werklike tyd) tyd bel. Maar 'n redelike aanname is dat die oproepe is gewaarborg sodanig dat die tyd argumente is aan die toeneem is. In hierdie geval moet jy 'n gesorteerde lys van alarm tyd waardes te handhaaf, en vir elke werk en lees noem jy kyk of die tyd argument is groter as die hoof van die alarm lys. Terwyl dit is 'n groter doen jy die alarm verwante verwerking (drop off die oudste update), verwyder die kop en kyk weer totdat al alarms voor die gegewe tyd verwerk. Doen dan die update oproep. Ek het tot dusver aanvaar is dit duidelik wat jy vir die werklike berekening sou doen, maar ek sal uitbrei net in geval. Ek neem aan jy het 'n metode float lees (int tyd) wat jy gebruik om die waardes te lees. Die doel is hierdie oproep so doeltreffend as moontlik te maak. So jy hoef nie te bereken die bewegende gemiddelde elke keer as die lees metode genoem. In plaas jy precompute die waarde soos op die laaste update of die laaste alarm, en tweak die waarde van 'n paar drywende punt bedrywighede om rekenskap te gee van die verloop van tyd sedert die laaste update. (I. E. 'N konstante aantal operasies behalwe miskien die verwerking van 'n lys van opgestapel alarms). Hopelik is dit duidelik - dit moet 'n baie eenvoudige algoritme en baie doeltreffend wees. Verdere optimalisering. een van die oorblywende probleme is as 'n groot aantal updates binne die venster gebeur, dan is daar 'n lang tyd waarvoor daar nie lees of updates, en dan 'n lees of werk kom saam. In hierdie geval, sal die bogenoemde algoritme ondoeltreffende in inkrementeel opdatering van die waarde vir elk van die updates wat val af wees. Dit is nie nodig nie, want ons het net omgee vir die laaste update oor die tyd venster so as daar 'n manier om al ouer updates doeltreffend af te laai, sal dit help. Om dit te doen, kan ons die algoritme om te doen 'n binêre soek na updates vir die mees onlangse update voor die tyd venster vind verander. As daar relatief min updates wat gevolg moet word laat val dan kan 'n mens geleidelik werk die waarde vir elke gedaal update. Maar as daar is baie opgraderings wat aangespreek moet word laat val dan kan 'n mens die waarde recompute van nuuts af na die val van die ou updates. Addendum op Inkrementele Berekening: Ek moet verduidelik wat ek bedoel met inkrementele berekening hierbo in die sin aanpas hierdie waarde met 'n paar drywende punt bedrywighede om rekenskap te gee van die verloop van tyd sedert die laaste update. Aanvanklike nie-inkrementele berekening Toe Itereer oor relevantupdates in volgorde van toenemende tyd: movingaverage (som lastupdate timesincelastupdate) / windowlength. Nou as presies een update val af by die venster uit, maar geen nuwe updates kom, pas som as: (let op dit priorupdate wat sy tyd stempel het verander om te begin van verlede venster begin). En as presies een werk gaan by die venster uit, maar geen nuwe updates afval, pas som as: Soos duidelik behoort te wees, dit is 'n rowwe skets, maar hopelik sal dit wys hoe jy die gemiddelde sodanig dat dit O (1) operasies per update kan handhaaf op 'n geamortiseerdekostebasis. Maar let op verdere optimalisering is in die vorige paragraaf. Let ook op stabiliteit kwessies verwys na in 'n ouer antwoord, wat beteken dat drywende punt foute kan versamel oor 'n groot aantal van sulke inkrementele bedrywighede soos dat daar 'n afwyking van die uitslag van die volle berekening wat wesenlik tot die aansoek. As 'n benadering is OK en Theres 'n minimum tyd tussen monsters, kan jy probeer super-steekproefneming. Het jy 'n skikking wat eweredig gespasieer tydintervalle wat korter as die minimum is verteenwoordig, en by elke tydperk winkel die nuutste monster wat ontvang is. Hoe korter die interval, sal die nader die gemiddelde wees om die werklike waarde. Die tydperk moet nie groter as die helfte van die minimum wees of daar is 'n kans van die vermiste 'n monster. antwoord 15 Desember 11 van die 18:12 Dankie vir die antwoord. Een verbetering wat dit nodig sou wees om werklik quotcachequot die waarde van die totale gemiddelde sodat ons don39t lus al die tyd. Ook, kan dit 'n geringe punt nie, maar sal dit nie meer doeltreffend om 'n deque of 'n lys te gebruik om die waarde te stoor, aangesien ons aanvaar dat werk sal in die korrekte volgorde te kom. Invoeging sal vinniger as in die kaart wees. â € Arthur 16 Desember 11 van die 08:55 Ja, jy kan die waarde van som kas. Trek die waardes van die monsters wat jy vee, voeg die waardes van die monsters wat jy voeg. Ook, ja, 'n dequeltpairltSample, Dategtgt kan meer doeltreffend wees. Ek verkies kaart vir leesbaarheid, en die gemak van beroep kaart :: Maximum. Soos altyd, skryf die korrekte kode eerste, dan profiel en inkrementele veranderinge meet. uitvoering maak Rob 16 Desember 11 om 15:00 Nota: Blykbaar is dit nie die manier om dit te benader. Verlaat dit hier vir verwysing op wat fout is met hierdie benadering is. Kyk op die kommentaar. UPDATED - gebaseer op Olis kommentaar. nie seker oor die onstabiliteit wat hy al praat. Gebruik 'n gesorteer kaart van aankoms tye teen waardes. By aankoms van 'n waarde toe te voeg die aankoms tyd om die gesorteerde kaart saam met die waarde daarvan en werk die bewegende gemiddelde. waarsku dit is pseudo-kode: Daar. Nie ten volle aangevul maar jy kry die idee. Dinge om daarop te let. Soos ek gesê het die bogenoemde is pseudo-kode. Jy moet 'n geskikte kaart te kies. Moenie verwyder die pare as jy Itereer deur as jy die iterator sal ongeldig en moet weer begin. Sien Olis kommentaar hieronder ook. antwoord 15 Desember 11 van die 12:22 Dit doesn39t werk: dit doesn39t in ag neem watter gedeelte van die venster-lengte elke waarde bestaan vir. Ook hierdie benadering van die toevoeging en dan trek net stabiel vir heelgetal tipes, nie dryf. uitvoering maak Oliver Charles 15 Desember 11 by 00:29 OliCharlesworth - jammer ek gemis 'n paar belangrike punte in die beskrywing (dubbel en-time geweeg). Ek sal werk. Dankie. â € Dennis 15 Desember 11 by 12:33 Die tydbeswaringsfaktor is nog 'n probleem. Maar that39s nie wat I39m praat. Ek het verwys na die feit dat wanneer 'n nuwe waarde eers die tyd venster binnekom, sy bydrae tot die gemiddelde is minimaal. Sy bydrae gaan voort om te verhoog tot 'n nuwe waarde betree. uitvoering maak Oliver Charles 15 Desember 11 by 12: 35In statistieke n eenvoudige bewegende gemiddelde is 'n algoritme wat die ongeweegde gemiddelde van die laaste N monsters bereken. Die parameter N word dikwels die grootte venster, omdat die algoritme kan beskou word as 'n venster wat gly oor die datapunte. Deur die gebruik van 'n rekursiewe formulering van die algoritme, is die aantal operasies wat per monster verminder tot een Daarbenewens een aftrek en een afdeling. Aangesien die formulasie is onafhanklik van die venster grootte N. die runtime kompleksiteit is O (1). maw konstante. Die rekursiewe formule van die ongeweegde bewegende gemiddelde is, waar gemiddelde is die rollende gemiddelde en x verteenwoordig 'n data punt. So, wanneer die venster skyfies na regs, een datapunt, die stert, druppels uit en een datapunt, die hoof, beweeg in. Implementering 'n uitvoering van die eenvoudige bewegende gemiddelde het om die volgende in ag Algoritme inisialisering neem Solank die venster is nie ten volle gevul is met waardes, die rekursiewe formule versuim. Stoor Toegang tot die stert element vereis word, wat na gelang van die implementering vereis 'n stoor van n elemente. My implementering gebruik die aangebied formule wanneer die venster is heeltemal gevul is met waardes, en anders skakel om die formule, wat die gemiddelde updates deur herbereken die som van die vorige elemente. Let daarop dat dit kan lei tot numeriese onstabiliteit as gevolg van drywende punt rekenkundige. Sover geheue verbruik betref, is die implementering gebruik iterators om tred te hou van kop en stert elemente hou. Dit lei tot 'n uitvoering met 'n konstante herinnering vereistes onafhanklik van die venster grootte. Hier is die update proses wat die venster na regs skuif. In die meeste van die versamelings ongeldig hul sensusopnemers wanneer die onderliggende versameling is verander. Die implementering egter staatmaak op geldig opnemers. Veral in streaming gebaseerde programme die onderliggende versameling behoeftes verander wanneer 'n nuwe element kom. Een manier om dit te hanteer wat 'n eenvoudige omsendbrief vaste grootte versameling grootte N1 wat nooit invalidates sy iterators en afwisselend voeg 'n element en oproep Shift te skep. Ek wens ek kon uitvind hoe om dit eintlik te implementeer, soos die toets funksie is baie verwarrend om me8230 Moet ek data te omskep in Array, dan hardloop SMA SMA nuwe SMA (20, skikking) vir 'n tydperk van 20 SMA Hoe hanteer ek verskuiwing () funksie is dit nodig om vervaardigerskampioenskap te implementeer. (Jammer vir die verwarring). Nee, jy don8217t nodig het om jou data so lank te omskep in 'n skikking as jou data implemente IEnumerable1 en die versyferde tipe is dubbel. Wat jou persoonlike boodskappe betref wat jy nodig het om die DataRow te skakel na iets wat enumerable dubbele waardes. Jou benadering werk. Verskuiwing, gly die venster een posisie na links. Vir 'n datastel van sê 40 waardes en 'n 20 tydperk SMA het jy 21 poste by die venster pas (40 8211 20 1). Elke keer as jy bel Shift () die venster na links verskuif deur een posisie en Gemiddeld () gee terug Die SMA vir die huidige venster posisie. Dit wil sê, die ongeweegde gemiddelde van alle waardes in die venster. Daarbenewens my implementering toelaat om die SMA bereken selfs indien die venster is nie ten volle gevul aan die begin. So in wese hoop dit help. Enige verdere vrae kopieregkennisgewing Christoph Heindl en cheind. wordpress, 2009-2012. Ongemagtigde gebruik en / of duplisering van hierdie materiaal sonder uitdruklike en skriftelike toestemming van die blogs skrywer en / of eienaar is streng verbode. Uittreksels en skakels mag gebruik word, met dien verstande dat die volle en duidelike krediet gegee word aan Christoph Heindl en cheind. wordpress met toepaslike en spesifieke rigting van die oorspronklike inhoud. Recent Posts ArchivesA nader kyk na die Advanced CODAS bewegende gemiddelde Algoritme Versatile bewegende gemiddelde in Gevorderde CODAS algoritme filters golfvorm geraas, uittreksels bedoel, en elimineer basislyn drif. Die bewegende gemiddelde is 'n eenvoudige wiskundige tegniek hoofsaaklik gebruik word om afwykings te skakel en openbaar die werklike tendens in 'n versameling van data punte. Jy kan vertroud is met dit uit gemiddeld lawaaierige data in 'n groentjie fisika eksperiment, of uit die dop van die waarde van 'n belegging wees. Jy kan nie weet dat die bewegende gemiddelde is ook 'n prototipe van die eindige impulsrespons filter, die mees algemene tipe filter gebruik in rekenaar-gebaseerde toerusting. In gevalle waar 'n gegewe golfvorm word gewy word met geraas, waar 'n gemiddelde onttrek moet word van 'n periodiese sein, of waar 'n stadig dryf basislyn moet uitgeskakel word van 'n hoër frekwensie sein, kan 'n bewegende gemiddelde filter toegepas die gewenste te bereik gevolg. Die bewegende gemiddelde algoritme van Advanced CODAS bied hierdie soort van golfvorm filter prestasie. Gevorderde CODAS is 'n analise sagteware pakket wat werk op bestaande golfvorm data lêers geskep deur die eerste generasie WinDaq of tweede generasie WinDaq data verkryging pakkette. Benewens die bewegende gemiddelde algoritme, Advanced CODAS sluit ook 'n verslag generator nut en sagteware roetines vir golfvorm integrasie, differensiasie, piek en dal vaslegging, regstelling, en rekenkundige operasies. Bewegende gemiddelde filter Teorie DATAQ instrumente bewegende gemiddelde algoritme kan 'n groot mate van buigsaamheid in golfvorm filter aansoeke. Dit kan gebruik word as 'n laaglaatfilter om die geraas deel is van baie soorte golfvorms verswak, of as 'n hoë-pass filter om 'n drywende basislyn van 'n hoër frekwensie sein uit te skakel. Die prosedure wat gevolg word deur die algoritme om die bedrag van filters bepaal behels die gebruik van 'n glad faktor. Dit glad faktor, deur jou beheer word deur die sagteware, kan verhoog of verlaag die aantal werklike golfvorm data punte of monsters wat die bewegende gemiddelde sal strek spesifiseer. Enige periodieke golfvorm kan wees gedink as 'n lang tou of versameling van data punte. Die algoritme accomplishes 'n bewegende gemiddelde deur twee of meer van hierdie datapunte uit die verkry golfvorm, toe te voeg, te verdeel hul som van die totale aantal datapunte bygevoeg, die vervanging van die eerste data punt van die golfvorm met die gemiddelde net bereken en herhaal die stappe met die tweede, derde en so aan datapunte tot die einde van die data bereik word. Die resultaat is 'n tweede of gegenereer golfvorm bestaan uit die gemiddeld data en met dieselfde aantal punte as die oorspronklike golfvorm. Figuur 1 8212 Enige periodieke golfvorm kan beskou word as 'n lang tou of versameling van data punte. In die bostaande illustrasie, is agtereenvolgende golfvorm data punte wat deur quotyquot om te illustreer hoe die bewegende gemiddelde bereken word. In hierdie geval, 'n glad faktor van drie toegepas, wat beteken dat drie agtereenvolgende datapunte vanaf die oorspronklike golfvorm bygevoeg, hulle som gedeel deur drie, en dan is dit kwosiënt is geplot as die eerste data punt van 'n gegenereer golfvorm. Die proses herhaal met die tweede, derde en so aan datapunte van die oorspronklike golfvorm tot aan die einde van die data bereik word. 'N Spesiale quotfeatheringquot tegniek gemiddeldes die begin en einde data punte van die oorspronklike golf-vorm om te verseker dat die gegenereerde golfvorm bevat dieselfde aantal datapunte as die oorspronklike. Figuur 1 illustreer hoe die bewegende gemiddelde algoritme is toegepas op datapunte (wat verteenwoordig word deur y) golfvorm. Die illustrasie beskik oor 'n glad faktor van 3, wat beteken dat die gemiddelde waarde (verteenwoordig deur a) word bereken oor 3 agtereenvolgende golfvorm datawaardes. Let op die oorvleueling wat in die bewegende gemiddelde berekeninge bestaan. Dit is hierdie oorvleueling tegniek, saam met 'n spesiale beginning - en eindpunt behandeling wat dieselfde aantal datapunte in die gemiddelde golfvorm genereer as bestaan het in die oorspronklike. Die manier waarop die algoritme bereken 'n bewegende gemiddelde verdien 'n nader kyk en kan geïllustreer met 'n voorbeeld. Sê ons op 'n dieet gewees het vir twee weke en ons wil ons gemiddelde gewig bereken die afgelope 7 dae. Ons wil ons gewig op te som op dag 7 met ons gewig op dae 8, 9, 10, 11, 12, en 13 en dan vermenigvuldig met 1/7. Om die proses te formaliseer, kan dit uitgedruk word as: (. Y (7) y (8) y (9) y (13)) 'n (7) 1/7 Hierdie vergelyking kan verder veralgemeen word. Die bewegende gemiddelde van 'n golfvorm kan bereken word deur: Waar: 'n gemiddeld waarde N datapunt posisie is glad faktor y werklike data punt waarde Figuur 2 8212 Die vrag sel uitsetgolfvorm getoon oorspronklike en ongefiltreerde in die top-kanaal en as 'n 11-punt beweeg gemiddeld golfvorm in die onderste kanaal. Die geraas wat op die oorspronklike golfvorm te wyte was aan die intense vibrasies geskep deur die pers gedurende die verpakking werking. Die sleutel tot hierdie algoritmes buigsaamheid is sy wye verskeidenheid van te kies glad faktore (van 2 - 1000). Die glad faktor bepaal hoeveel werklike datapunte of monsters sal gemiddeld. Spesifisering enige positiewe glad faktor simuleer 'n laaglaatfilter terwyl spesifiseer van 'n negatiewe glad faktor simuleer 'n hoë-pass filter. Gegewe die absolute waarde van die smoothing faktor, hoër waardes groter glad beperkings op die gevolglike golfvorm en omgekeerd, laer waardes minder glad. Met die toepassing van die korrekte glad faktor, kan die algoritme ook gebruik word om die gemiddelde waarde van 'n gegewe periodieke golfvorm te onttrek. 'N Hoër positiewe glad faktor is tipies aangewend vir die opwekking van gemiddelde golfvorm waardes. Die toepassing van die bewegende gemiddelde Algoritme A opvallende kenmerk van die bewegende gemiddelde algoritme is dat dit baie keer toegepas kan word om dieselfde golfvorm indien nodig om die gewenste filter resultaat te kry. Golfvorm filter is 'n baie subjektiewe oefening. Wat kan 'n behoorlik gefilter golfvorm om 'n gebruiker kan onaanvaarbaar lawaaierige na 'n ander te wees. Net jy kan oordeel of die aantal gemiddeld punte gekies te hoog, te laag, of net reg was. Die buigsaamheid van die algoritme kan jy die smoothing faktor aan te pas en maak 'n ander pas deur die algoritme toe bevredigende resultate nie bereik word met die aanvanklike poging. Die aansoek en vermoëns van die bewegende gemiddelde algoritme kan die beste geïllustreer deur die volgende voorbeelde. Figuur 3 8212 Die EKG golfvorm getoon oorspronklike en ongefiltreerde in die top-kanaal en as 'n 97-punt bewegende gemiddelde golfvorm in die onderste kanaal. Let op die afwesigheid van basislyn drif in die onderste kanaal. Beide golfvorms word in 'n saamgeperste voorwaarde vir aanbieding doeleindes. A Ruisonderdrukking toepassing in gevalle waar 'n gegewe golfvorm is deurmekaar met geraas, kan die bewegende gemiddelde filter toegepas word op die geraas te onderdruk en lewer 'n duideliker prentjie van die golfvorm. Byvoorbeeld, is 'n gevorderde CODAS kliënt met behulp van 'n pers en 'n vrag sel in 'n verpakking werking. Hul produk was om saamgepers tot 'n voorafbepaalde vlak (gemonitor word deur die vrag sel) om die grootte van die pakket wat nodig is om die produk bevat verminder. Vir gehaltebeheer redes, het hulle besluit om die pers in samewerking met instrumentasie te monitor. 'N Onverwagse probleem verskyn toe hulle begin lees van die real-time vrag sel uitset. Sedert die druk masjien vibreer aansienlik terwyl dit in werking, die vrag selle uitsetgolfvorm was moeilik om te onderskei, want dit 'n groot hoeveelheid van die geraas wat as gevolg van die vibrasie soos in die top-kanaal van Figuur 2. Dit geraas uitgeskakel deur die opwekking van 'n 11-punt bewegende gemiddelde kanaal soos in die onderste kanaal van Figuur 2. Die gevolg was 'n baie duideliker prentjie van die vrag selle uitset. 'N Aansoek in die uitskakeling van Basislyn Drift In gevalle waar 'n stadig dryf basislyn behoeftes van 'n hoër frekwensie sein te verwyder, kan die bewegende gemiddelde filter toegepas word op die drywende basislyn te skakel. Byvoorbeeld, 'n EKG golfvorm vertoon tipies 'n mate van basislyn dwaal soos gesien kan word in die top-kanaal van figuur 3. Dit basislyn drif kan uitgeskakel word sonder om of die eienskappe van die golfvorm ontstellend soos in die onderste kanaal van figuur 3. Dit word bereik deur die toepassing van 'n toepaslike negatiewe waarde glad faktor tydens die bewegende gemiddelde berekening. Die toepaslike glad faktor bepaal word deur 'n golfvorm tydperk (in sekondes) deur die kanale voorbeeld interval. Die kanale voorbeeld interval is eenvoudig die omgekeerde van die kanale monster tempo en is gerieflik vertoon op die bewegende gemiddelde nut spyskaart. Die golfvorm tydperk is maklik bepaal uit die skerm deur die posisionering van die muis op 'n gerieflike plek op die golfvorm, die opstel van 'n tyd merker, en dan beweeg die wyser een volledige siklus weg van die vertoon tyd merker. Die tydsverskil tussen wyser en tyd merker is een golfvorm tydperk en vertoon aan die onderkant van die skerm in sekondes. In ons EKG byvoorbeeld die golfvorm besit 'n kanaal voorbeeld interval van 0,004 sekondes (verkry uit die bewegende gemiddelde nut spyskaart) en een golfvorm tydperk is gemeet aan 0,388 sekondes strek. Die verdeling van die golfvorm tydperk deur die kanale voorbeeld interval het ons 'n glad faktor van 97. Aangesien dit die basislyn drif wat ons is geïnteresseerd in die uitskakeling van ons toegepas n negatiewe glad faktor (-97) om die bewegende gemiddelde algoritme. Dit in werking afgetrek die bewegende gemiddeld gevolg van die oorspronklike golfvorm sein, wat die basislyn drif uitgeskakel sonder om golfvorm inligting. Ander Golfvorm bewegende gemiddelde Kwessies Wat die aansoek, die universele rede vir die toepassing van 'n bewegende gemiddelde filter is om quotsmooth outquot die hoë en lae afwykings en openbaar 'n meer verteenwoordigende intermediêre golfvorm waarde. Wanneer dit te doen, moet die sagteware nie ander kenmerke van die oorspronklike golfvorm kompromie in die proses vir die opwekking van 'n bewegende gemiddeld golfvorm. Byvoorbeeld, moet die sagteware outomaties die kalibrasie inligting wat verband hou met die oorspronklike data lêer aan te pas, sodat die bewegende gemiddeld golfvorm is in die toepaslike ingenieurswese eenhede toe gegenereer. Alle lesings in die syfers is geneem met behulp van WinDaq Data Acquisition softwareIt kan wees as jy 'n gewig wat is omgekeerd eweredig aan die venster grootte van toepassing: openbare klas AverageCounter int RunningAvg int RunningCount // Dit vervang die omsendbrief lys int WindowSize openbare AverageCounter (int windowSize) WindowSize windowSize openbare leemte waarde toevoeg (float NewValue) // groei so groot soos venster as meer monsters aangeteken as (RunningCount Dit WindowSize) RunningCount // rekursiewe bewegende gemiddelde: // GT avg (N) (W - 1) / W avg (N -1) (1 / W) monster // waar W is venster grootte RunningAvg (((RunningCount - 1) / RunningCount) RunningAvg) (1 / RunningCount) NewValue openbare float Gemiddeld () terug RunningAvg - verander na 13:53 Vrydag 9 November 2007 pwasser 8-Jan-08 15:25 Hierdie formule werk goed om bewegende gemiddelde skat solank 'n paar beperkings in gedagte gehou word. Dit bere 'n skatting van die bewegende gemiddelde (nie die werklike bewegende gemiddelde) gebaseer op die belangrike aanname dat die monster waardes normaal versprei is oor die gemiddelde. Ek het daarop dit uit in 'n vorige post. toadth 9-Oktober-11 14:46 Wel, dit was dom wasnt dit. 4 jaar op en kan ek 'n beter voorstel het. Eerder as om te gebruik 'n omsendbrief lys, gebruik 'n geskakelde lys en die hand van die maksimum lys grootte handhaaf. Op hierdie manier kan jy 'n lopende totaal van die totale hou - wanneer dit by die skakel lys, voeg by die totaal, wanneer snoei 'n knoop, aftrek wat waarde uit die totaal. Vir 'n gemiddelde toonbank met 5 knope, miskien jy is nie hiermee 'n prestasie te verbeter, maar vir baie gevalle met sê duisende nodes dit sou saak. 1. In die waarde toevoeg metode, voeg 'n nuwe skakel lys knoop, en voeg by GEMIDDELDE 2. Na die toevoeging van, check die grootte 3. As die grootte drumpel: Trek uit Gemiddelde en dan knip af knoop. Vir nog meer doeltreffendheid, in plaas van die gebruik van geskakelde lys, jy kan jou eie omsendbrief lys implementeer gebaseer op 'n verskeidenheid van die waardes - trek uit GEMIDDELDE wanneer jy 'n verskeidenheid waarde te vervang. Marc Clifton 10-Oktober-11 00:37 4 jaar en ek kan 'n beter voorstel het. Inderdaad, wat sou beter werk. Ek is nie certainn van die korrekte oplossing al sedert die WHALM gemiddeld van elke monster sou 'n billike bedrag van afronding fout te stel. Hmm. Ek wonder of verskil tussen Dobby die breukdeel van die hele gedeelte sal help. Verdeel die hele deel van elke getal met die telling. Hou drie hardloop somme: 1) Die gemiddelde van die hele dele, 2) Die res van elke afdeling, en 3) Die breukdeel van elke nommer. Elke keer as die hele deel van 'n aantal verdeeld is, word die hele deel gevolg by die gemiddelde hardloop som en die res word bygevoeg om die res loop som. Wanneer die res loop som verkry 'n waarde groter as of gelyk aan die telling, sy gedeel deur die telling met die hele deel gevolg by die gemiddelde hardloop som en die res by die res loop som. Ook by elke berekening, die breukdeel word by die fraksionele hardloop som. Wanneer die gemiddelde klaar is, is die res loop som gedeel deur die telling en die gevolg is bygevoeg om die gemiddelde hardloop bedrag as 'n drywende nommer. Byvoorbeeld: Nou wat om te doen met die fraksionele hardloop som. Die gevaar van oorloop is baie minder geneig hier, al is steeds moontlik, so 'n manier om dit te hanteer sou wees om die fraksionele hardloop som deur die telling te verdeel aan die einde en voeg dit by ons gevolg: 'n alternatief sou wees om die fraksionele loop kyk som op elke berekening om te sien of dit is groter as of gelyk aan tel. Wanneer dit gebeur, net doen dieselfde ding wat ons doen met die res loop sum. Averages / Eenvoudige bewegende gemiddelde Gemiddeldes / Eenvoudige bewegende gemiddelde U word aangemoedig om hierdie taak op te los volgens die taakbeskrywing, die gebruik van enige taal wat jy kan weet. Berekening van die eenvoudige bewegende gemiddelde van 'n reeks van getalle. Skep 'n Stateful funksie / klas / instansie wat 'n tydperk neem en gee 'n roetine dat 'n aantal neem as argument en gee 'n eenvoudige bewegende gemiddelde van sy argumente tot dusver. 'N Eenvoudige bewegende gemiddelde is 'n metode vir die berekening van 'n gemiddelde van 'n stroom van getalle met slegs gemiddeld die afgelope 160 P 160 nommers van die stroom, 160 waar 160 P 160 is bekend as die tydperk. Dit kan toegepas word deur die roeping van 'n parafering roetine met 160 P 160 as sy argument, 160 I (P), 160 wat dan 'n roetine dat wanneer geroep met individuele, opeenvolgende lede van 'n stroom van getalle, bere die gemiddelde van sou terugkeer (up om), die laaste 160 P 160 van hulle, kan noem dit 160 SMA (). Die woord 160 Stateful 160 in die taak beskrywing verwys na die behoefte aan 160 SMA () 160 om sekere inligting tussen oproepe onthou om dit: 160 Die tydperk, 160 P 160 N bestel houer van ten minste die laaste 160 P 160 nommers uit elk van sy individuele oproepe. Stateful 160 beteken ook dat opeenvolgende oproepe na 160 I (), 160 die initializer, 160 moet afsonderlike roetines wat doen 160 nie 160 aandele gered staat sodat hulle kan gebruik word op twee onafhanklike strome van data terugkeer. Pseudo-kode vir die implementering van 160 SMA 160 is: Hierdie weergawe maak gebruik van 'n aanhoudende tou om die mees onlangse p waardes hou. Elke funksie teruggekeer van init-bewegende-gemiddelde het sy toestand in 'n atoom met 'n tou waarde. Dit implementering gebruik 'n omsendbrief lys van die nommers in die venster op te slaan aan die begin van elke iterasie wyser verwys na die lys sel wat hou die waarde net beweeg by die venster uit en vervang moet word met die net toegevoegde waarde. Met behulp van 'n afsluiting wysig Tans hierdie SMA cant nogc wees omdat dit 'n sluiting op die wal ken. Sommige ontsnapping analise kan die hoop toekenning te verwyder. Met behulp van 'n struct wysig Hierdie weergawe vermy die hoop toekenning van die sluiting behoud van die data in die stapel raamwerk van die hooffunksie. Dieselfde uitset: Om te verhoed dat die drywende punt benaderings hou opstapel en groei, kan die kode 'n periodieke som uit te voer op die hele ronde tou skikking. Dit implementering produseer twee (funksie) voorwerpe deel staat. Dit is idiomatiese in E te skei insette van uitset (lees en skryf) eerder as om dit kombineer in een voorwerp. Die struktuur is dieselfde as die implementering van Standard DeviationE. Die onderstaande elikser program genereer 'n anonieme funksie met 'n ingeboude tydperk p, wat gebruik word as die tydperk van die eenvoudige bewegende gemiddelde. Die aanloop funksie lees numeriese insette en gee dit aan die nuutgeskepte anonieme funksie, en dan inspekteer die resultaat te STDOUT. Die uitset word hieronder getoon, met die gemiddelde, gevolg deur die gegroepeer insette, wat die basis vorm van elke bewegende gemiddelde. Erlang het sluitings, maar onveranderlike veranderlikes. 'N Oplossing is dan om prosesse en 'n eenvoudige boodskap verby gebaseer API te gebruik. Matrix tale roetines om die sweef avarages vir 'n gegewe volgorde van items bereken. Dit is minder doeltreffend te loop as in die volgende opdragte. Voortdurend gevra vir 'n inset ek. wat by die einde van 'n lys T1. T1 kan gevind word deur te druk 2ND / 1, en gemiddelde kan gevind word in Lys / OPS druk op die program te beëindig. Funksie wat 'n lys met die gemiddeld data van die verskaf argument program wat 'n eenvoudige waarde terug by elke aanroeping terug: lys is die lys word gemiddeld: p is die tydperk: 5 opbrengste die gemiddeld lys: Voorbeeld 2: Die gebruik van die program movinav2 (i , 5) - Inisialiseer bewegende gemiddelde berekening, en definieer tydperk van 5 movinav2 (3, x): x - nuwe data in die lys (waarde 3), en gevolg sal word gestoor op veranderlike x, en vertoon movinav2 (4 x) : x - nuwe data (waarde 4), en die nuwe gevolg sal gestoor word op veranderlike x, en vertoon (43) / 2. Beskrywing van die funksie movinavg: veranderlike r - is die gevolg (die gemiddeld lys) wat veranderlike sal teruggestuur word ek - is die indeks veranderlike, en dit dui op die einde van die sub-lys die lys word gemiddeld. veranderlike Z - 'n helper veranderlike Die funksie gebruik veranderlike i om vas te stel watter waardes van die lys sal in die volgende gemiddelde berekening in ag geneem word. By elke iterasie, veranderlike i dui op die laaste waarde in die lys wat gebruik sal word in die gemiddelde berekening. So ons moet net om uit te vind wat die eerste waarde in die lys sal wees. Gewoonlik goed moet p elemente oorweeg, sodat die eerste element sal die een geïndekseer deur (i-P1) te wees. Maar op die eerste iterasies wat berekening gewoonlik negatief sal wees, sodat die volgende vergelyking negatiewe indekse sal vermy: Max (i-p1,1) of, reël die vergelyking, Max (i-p, 0) 1. of, die reël van die vergelyking, (i - (Max (IP, 0) 1) 1), en dan - maar die aantal elemente op die eerste iterasies sal ook kleiner wees, sal die korrekte waarde (begin indeks 1 einde indeks) wees , (i-Max (IP, 0)). Veranderlike Z hou die algemene waarde (maksimum (IP), 0) sodat die beginindex sal wees (Z1) en die numberofelements sal wees (iz) die middel (lys, Z1, iz) sal die lys van waarde wat sal gemiddeld som terugkeer ( .) sal hulle som som (.) / (iz) ri sal hulle gemiddeld en stoor die resultaat in die toepaslike plek in die lys gevolg behulp van 'n sluiting en die skep van 'n funksie
No comments:
Post a Comment