Sunday, October 16, 2016

C ++ Bewegende Gemiddelde

Is dit moontlik om 'n bewegende gemiddelde in C te implementeer sonder die behoefte aan 'n venster van monsters Ive het bevind dat ek 'n bietjie kan optimaliseer, deur die keuse van 'n venster grootte dis 'n krag van twee voorsiening te maak vir bietjie-verskuiwing in plaas van verdeel, maar nie nodig 'n buffer sal lekker wees. Is daar 'n manier om 'n nuwe bewegende gemiddelde resultaat slegs as 'n funksie van die ou gevolg en die nuwe monster te druk definieer 'n voorbeeld bewegende gemiddelde, oor 'n venster van 4 monsters te wees: Voeg nuwe monster e: 'n bewegende gemiddelde kan rekursief geïmplementeer , maar vir 'n presiese berekening van die bewegende gemiddelde jy die oudste insette monster in die som (dws die 'n in jou voorbeeld) onthou. Vir 'n lengte N bewegende gemiddelde wat jy bereken: waar yn is die uitsetsein en xn is die insetsein. Aand. (1) kan rekursief geskryf word as sodat jy altyd moet die monster xn-N onthou om te bereken (2). Soos uitgewys deur Conrad Turner, kan jy 'n (oneindig lank) eksponensiële venster plaas, wat dit moontlik maak om die uitset net uit die verlede uitset en die huidige insette te bereken gebruik, maar dit is nie 'n standaard (ongeweegde) bewegende gemiddelde, maar 'n eksponensieel geweegde bewegende gemiddelde, waar monsters verder in die verlede kry 'n kleiner gewig, maar (ten minste in teorie) wat jy nooit iets vergeet nie (die gewigte kry net kleiner en kleiner vir monsters ver in die verlede). inisialiseer totale 0, count0 (elke keer sien 'n nuwe waarde toe een insette (scanf), een totalnewValue, een inkrement (telling), een kloof gemiddelde (totale / telling voeg) Dit sou 'n bewegende gemiddelde oor alle insette Om die gemiddelde bereken word oor net die laaste 4 insette, sal vereis 4 inputvariables, miskien kopiëring elke insette om 'n ouer inputvariable, dan berekening van die nuwe bewegende gemiddelde. as som van die 4 inputvariables, gedeel deur 4 (regs skuif 2 sal goed wees as al die insette was positiewe te maak die gemiddelde calculationI weet dit is haalbaar met hupstoot volgens:.. Maar ek wil graag om te verhoed dat die gebruik van hupstoot ek googled en nie gevind nie enige geskikte of leesbare voorbeelde eintlik wil ek die bewegende gemiddelde van 'n deurlopende stroom van die spoor 'n stroom van drywende punt getalle met behulp van die mees onlangse 1000 getalle as 'n data monster. wat is die maklikste manier om dit wat ek eksperimenteer met die gebruik van 'n omsendbrief skikking, eksponensiële bewegende gemiddelde en 'n meer eenvoudige bewegende gemiddelde en gevind bereik dat die resultate van die omsendbrief verskeidenheid geskik my behoeftes beste. gevra 12 Junie 12 aan 04:38 As jou behoeftes is eenvoudig, kan jy net probeer om met behulp van 'n eksponensiële bewegende gemiddelde. Eenvoudig gestel, jy maak 'n akkumulator veranderlike, en as jou kode kyk na elke monster, die kode updates die akkumulator met die nuwe waarde. Jy kies 'n konstante alfa wat tussen 0 en 1, en bereken die volgende: Jy hoef net 'n waarde van alfa vind waar die effek van 'n gegewe voorbeeld net duur vir ongeveer 1000 monsters. Hmm, Ek is nie eintlik seker dit is geskik vir jou, noudat Ive het dit hier. Die probleem is dat 1000 is 'n mooi lang venster vir 'n eksponensiële bewegende gemiddelde Ek is nie seker daar is 'n alfa dat die gemiddelde van die afgelope 1000 getalle sou versprei, sonder onderloop in die drywende punt berekening. Maar as jy 'n kleiner gemiddelde, wou soos 30 nommers of so, dit is 'n baie maklike en vinnige manier om dit te doen. antwoord 12 Junie 12 by 04:44 1 op jou post. Die eksponensiële bewegende gemiddelde kan nie toelaat dat die alfa tot wisselvallig wees. So dit kan dit gebruik word om tyd basis gemiddeldes bereken (bv grepe per sekonde). As die tyd sedert die laaste akkumulator update is meer as 1 sekonde, jy laat Alpha wees 1.0. Anders, kan jy laat Alpha wees (usecs sedert verlede update / 1000000). â € jxh 12 Junie 12 aan 06:21 Eintlik wil ek die bewegende gemiddelde van 'n deurlopende stroom van 'n stroom van drywende punt getalle met behulp van die mees onlangse 1000 getalle as 'n data monster op te spoor. Let daarop dat die onderstaande updates die totale soos elemente soos bygevoeg / vervang, vermy duur O (N) traversal om die som te bereken - wat nodig is vir die gemiddelde - op aanvraag. Totaal gemaak 'n ander parameter van T te ondersteun bv met behulp van 'n lang lang wanneer altesaam 1000 lank s, 'n int vir char s, of 'n dubbel totale float s. Dit is 'n bietjie gebrekkig deurdat numsamples kon verby INTMAX - as jy omgee wat jy kan gebruik om 'n unsigned long lank. of gebruik 'n ekstra Bool data lid aan te teken wanneer die houer eerste gevul terwyl fietsry numsamples rondom die skikking (beste herdoop dan iets onskuldig soos POS). antwoord 12 Junie 12 aan 05:19 aanvaar word dat quotvoid operateur (T monster) quot is eintlik quotvoid operatorltlt (T monster) quot. â € oPless 8 Junie 14 by 11:52 oPless ahhh. goed raakgesien. eintlik het ek bedoel dat dit nietig operateur () (T monster), maar natuurlik jy kan gebruik wat ook al notasie jy graag. Sal los, te danke. â € Tony D 8 Junie 14 by 14: 27I wil berekening vir aandele prys bewegende gemiddelde ontwikkel. Maar baie komplekse berekeninge het later beplan. My eerste stap om te weet hoe om te bereken bewegende gemiddelde doeltreffend. Ek moet weet hoe om die insette te neem en uitvoer doeltreffend terugkeer. deurdagte insette Datum en prys. consudered uitset Datum, Prys en bewegende gemiddelde. As ek 500 rekords en ek wil Moving gemiddelde te bereken vir 5 dae wat die effient manier in plaas van heen en weer in die skikking van Datum en prys gaan weer asseblief suggereert wat is die beste manier om insette (Array List, Table, verskeidenheid ontvang ens) en terug te keer uitset. Nota: Vandag se MA van 5 dae sal gemiddeld van Laaste 5 Dae insluitend vandag prys. Gister MA sal gemiddeld van laaste 5 dae van gister wees. Ek wil die dae hou buigsaam in plaas van 5 te wees dit kan 9, 14, 20 wees ens Donderdag, April 10, 2008 15:21 As jy eenvoudige berekening moet sonder jou moeite as jy TA-Lib kan gebruik. Maar as jy wil hê dat jou berekening om meer doeltreffend as TA-Lib wees, dan kan jy jou eie tegniese aanwyser skep. TA-Lib is groot, maar die probleem is dat hierdie biblioteek het net statiese metodes. Dit beteken dat wanneer jy dit nodig om SMA verskeidenheid waardes te bereken gebaseer op 500 prys bars, dan sal jy die hele spektrum van bars stuur en dit sal n verskeidenheid van SMA waardes terugkeer. Maar as jy 'n nuwe 501-ste waarde ontvang dan moet jy weer stuur die hele reeks en TA-Lib sal weer bereken en terugkeer SMA verskeidenheid van waardes. Nou dink jy so aanwyser op werklike prys voer nodig het, en vir elke prysverandering jy nuwe aanwyser waarde nodig het. As jy een het aanwyser is nie 'n groot probleem, maar as jy honderde aanwysers werk, kan dit 'n prestasie probleem wees. Ek was in so 'n situasie en begin met die ontwikkeling realtime aanwysers wat doeltreffende is en om addisionele berekeninge vir nuwe prys bar of slegs veranderde prys bar. Unfortunatelly ek nooit SMA aanwyser wat nodig is vir my handel stelsels, maar ek het so vir EMO, WMA, AD, en ander. Een so 'n aanwyser nC gepubliseer op my blog en jy kan sien van daar af wat is die basiese struktuur van my realtime aanwyser klas. Ek hoop jy sal klein veranderinge moet implementeer SMA aanwyser, want een van die eenvoudigste een. Die logika is eenvoudig. Om SMA bereken alles wat jy nodig het is 'n laaste prys waardes. So klas geval sal versameling van pryse, wat sal slaan hou net verlede N aantal pryse as SMA gedefinieer (in jou geval 5) het. So wanneer jy 'n nuwe bar, jy sal oudste een verwyder en voeg nuwe een en skep berekening. Donderdag, 10 April, 2008 16:04 Alle antwoorde Daar is 'n biblioteek genoem TA-Lib dat alles wat vir jou doen en dit is open source. Dit het sowat 50 aanwysers ek dink. Weve gebruik dit in produksie-omgewing en dit is baie effektief en realible. Jy kan dit gebruik in C, Java, C, ens As jy eenvoudige berekening moet sonder jou moeite as wat jy TA-Lib kan gebruik. Maar as jy wil hê dat jou berekening om meer doeltreffend as TA-Lib wees, dan kan jy jou eie tegniese aanwyser skep. TA-Lib is groot, maar die probleem is dat hierdie biblioteek het net statiese metodes. Dit beteken dat wanneer jy dit nodig om SMA verskeidenheid waardes te bereken gebaseer op 500 prys bars, dan sal jy die hele spektrum van bars stuur en dit sal n verskeidenheid van SMA waardes terugkeer. Maar as jy 'n nuwe 501-ste waarde ontvang dan moet jy weer stuur die hele reeks en TA-Lib sal weer bereken en terugkeer SMA verskeidenheid van waardes. Nou dink jy so aanwyser op werklike prys voer nodig het, en vir elke prysverandering jy nuwe aanwyser waarde nodig het. As jy een het aanwyser is nie 'n groot probleem, maar as jy honderde aanwysers werk, kan dit 'n prestasie probleem wees. Ek was in so 'n situasie en begin met die ontwikkeling realtime aanwysers wat doeltreffende is en om addisionele berekeninge vir nuwe prys bar of slegs veranderde prys bar. Unfortunatelly ek nooit SMA aanwyser wat nodig is vir my handel stelsels, maar ek het so vir EMO, WMA, AD, en ander. Een so 'n aanwyser nC gepubliseer op my blog en jy kan sien van daar af wat is die basiese struktuur van my realtime aanwyser klas. Ek hoop jy sal klein veranderinge moet implementeer SMA aanwyser, want een van die eenvoudigste een. Die logika is eenvoudig. Om SMA bereken alles wat jy nodig het is 'n laaste prys waardes. So klas geval sal versameling van pryse, wat sal slaan hou net verlede N aantal pryse as SMA gedefinieer (in jou geval 5) het. So wanneer jy 'n nuwe bar, jy sal oudste een verwyder en voeg nuwe een en skep berekening. Donderdag, 10 April, 2008 16:04 Ek sou die bewegende gemiddelde in die databasis bereken deur 'n gestoor proses of in 'n kubus. Het jy al gekyk na Analysis Services, dit het die vermoë om bewegende gemiddeldes te bereken. Donderdag, 10 April, 2008 04:05 Ja. TA-LIB is goed, maar kan nie geskik wees vir my. Toe ek nuwe waarde of opgedateer waarde toe te voeg vir die geskiedenis van rekords sal ek die berekening in 'n aparte funksie doen net vir daardie nuwe kwotasie en bêre dit in die databasis. Ek is van plan om die kwotasie te werk elke uur. Ek nodig het om te doen oor 25 tot 30 tegniese aanwysers vir 2200 aandele. Donderdag, 10 April, 2008 17:51 Uitvoering tyd van 'n TA-Lib oproep op 'n verskeidenheid van 10000 elemente duur ongeveer 15 millisekondes (op 'n Intel Core Duo 2.13 Ghz). Dit is die gemiddeld van al die funksies. Onder die vinnigste, SMA neem minder as 2,5 millisekondes. Die stadigste, HTTRENDMODE, neem 450 millisekondes. Met minder elemente is dit vinniger. SMA duur ongeveer 0,22 millisekondes vir 1000 insette elemente. Die spoed gewin is byna lineêre (die oorhoofse van die funksie oproep is weglaatbaar). In die konteks van jou aansoek, TA-Lib is baie onwaarskynlik dat jou bottelnek vir spoed prestasie wees. Ook het ek oor die algemeen nie so quotlast nquot oplossing beveel. Lees hieronder vir meer inligting. In die eerste plek 'n regstelling te Boban. s verklaring Alle funksies in TA-Lib kan ook 'n enkele laaste waarde te bereken deur die gebruik van 'n minimum van quotlast nquot elemente. Jy kan 'n verskeidenheid van grootte 10000 het, het data inisialiseer net vir die eerste 500 elemente, voeg 'n element en noem TA-Lib om die SMA bereken slegs vir die nuwe element. TA-Lib sal agtertoe nie meer as wat nodig is kyk (as SMA van 5, dan TA-Lib sal 'n enkele SMA met behulp van die afgelope 5 waardes te bereken). Dit word moontlik gemaak met die parameter startIdx en endIdx. Jy kan spesifiseer 'n reeks te bereken, of 'n enkele waarde. In hierdie scenario sal jy startIdx endIdx 500 maak om die 501 element te bereken. Hoekom is so quotlast nquot oplossing potensieel gevaarlik vir 'n paar Ongeag kies Boban. s oplossing of TA-Lib van mening dat die gebruik van 'n klein beperkte aantal afgelope data gewoond goed te werk met die meeste TA funksies. Met SMA, is dit duidelik dat jy hoef net n element om 'n gemiddelde oor N element te bereken. Dit is nie so eenvoudig met EMO (en baie ander TA funksies). Die algo dikwels afhang van die vorige waarde aan die nuwe waarde te bereken. Die funksie is rekursiewe. Dit beteken dat al die afgelope waardes het 'n invloed op toekomstige waardes. As jy besluit om jou algo quotlimitquot om slegs 'n klein hoeveelheid van die afgelope N waarde gebruik, sal jy nie dieselfde resultaat as iemand wat oor 'n groot aantal van die verlede waardes bereken kry. Die oplossing is 'n kompromie tussen spoed en akkuraatheid. Ek het al dikwels bespreek dit in die konteks van TA-Lib (Ek noem dit die quotunstable periodquot in die dokumentasie en forum). Om dit eenvoudig te hou, my algemene Aanbeveling is as jy die verskil tussen 'n algo cant maak met 'n eindige impulsrespons (FIR) van 'n algo met 'n oneindige impulsrespons (IIR), jy sal veiliger wees om te bereken oor al die inligting wat jy het beskikbaar. TA-Lib spesifiseer in die kode wat van sy werksaamhede het 'n onstabiele tydperk (IIR). Geredigeer deur mfortier Vrydag, 15 Augustus, 2008 04:25 korrekte Engelse sin Vrydag, 15 Augustus, 2008 04:20 AMC: Eenvoudige bewegende gemiddelde 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. Beskrywing 'n eenvoudige bewegende gemiddelde is 'n metode vir die berekening van 'n gemiddelde van 'n stroom van getalle deur net die laaste P nommers van die stroom, waar P staan ​​bekend as die tydperk gemiddeld. Dit kan toegepas word deur die roeping van 'n parafering roetine met P as sy argument, I (P), wat dan 'n roetine moet terugkeer dat wanneer hy met individuele, opeenvolgende lede van 'n stroom van getalle, bere die gemiddelde van (tot), die laaste P van hulle, kan noem dit SMA (). Die woord Stateful in die taak beskrywing verwys na die behoefte aan SMA () om sekere inligting tussen oproepe om dit te onthou: die tydperk, P 'n geordende houer van ten minste die laaste P getalle uit elk van die individuele oproepe. Stateful beteken ook dat opeenvolgende oproepe na ek (), die initializer, aparte roetines wat nie deel nie gered staat sodat hulle kan gebruik word op twee onafhanklike strome van data moet terugkeer. Pseudokode vir 'n uitvoering van SMA is: Gemiddeldes / 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