Thursday 12 October 2017

Glidande Medelvärde C Sharp


För att uppnå en asymptotisk prestanda av O n som den handkodade lösningen kan du använda Aggregate-funktionen som i. Det ackumulerade värdet som implementeras som anonym typ innehåller två fält Resultat innehåller resultatlistan uppbyggd hittills Arbeta innehåller den sista Period 1-element Den aggregerade funktionen lägger till det nuvarande värdet i arbetslistan, bygger nuvarande medelvärde och lägger till det i resultatet och tar sedan bort det första, dvs äldsta värdet från arbetslistan. Fröet, dvs startvärdet för ackumuleringen är byggd Genom att lägga de första periodens 1-element i Arbeta och initialisera Resultat till en tom lista. Följaktligen börjar aggregeringen med elementperiod genom att hoppa över period-1-element i början. I funktionell programmering är detta ett typiskt användningsmönster för aggregerings - eller vikningsfunktionen , Btw. Lösningen är inte funktionellt ren eftersom samma listobjekt Arbete och resultat återanvänds i varje steg Jag är inte säker på om det kan orsaka problem om så Mig framtida kompilatorer försöker parallellisera Aggregate-funktionen automatiskt å andra sidan Jag är inte heller säker, om det är möjligt, trots allt En rent funktionell lösning ska skapa nya listor vid varje steg. Observera också att C saknar kraftfulla uttrycksuttryck I någon hypotetisk Python - C-blandad pseudokod man kunde skriva aggregeringsfunktionen som. som skulle vara lite mer elegant i min ödmjuka åsikt. Notera löptiden för O n 2 eftersom du behöver hoppa över fler och fler element vid varje steg och afaik Hoppa över har jag Att ringa i tider Se mitt svar för en lösning i tiden jag bara märkte OP-kommentaren nedan att han kanske kommer att få värden från en SQL DB i framtiden I det här fallet skulle jag alla starkt avskräcka från den här lösningen MartinStettner Mar 3 11 vid 0 53. För det effektivaste sättet att beräkna ett rörligt medelvärde med LINQ, ska du inte använda LINQ. Istället föreslår jag att du skapar en hjälparklass som beräknar ett glidande medelvärde på bästa möjliga sätt med hjälp av ac Cirkulär buffert och kausalt rörligt medelfilter, sedan en förlängningsmetod för att göra den tillgänglig för LINQ. First up, det rörliga genomsnittet. Denna klass ger en mycket snabb och lätt implementering av ett MovingAverage-filter. Det skapar en cirkulär buffert av längd N och beräknar en Lägg till, en subtrahera och en multiplicera per datapunkt som bifogas, i motsats till N multiplicera-adds per punkt för brute force implementation. The ovanstående förlängningsmetoder sätter in MovingAverage-klassen och tillåter införande i en IEnumerable stream. To göra detta i en Mer funktionellt sätt, du behöver en skanningsmetod som finns i Rx men inte i LINQ. Låt oss se hur det skulle se ut om vi skulle ha en skanningsmetod. Och här är skanningsmetoden som tas och justeras härifrån. Har bättre prestanda än brute force-metoden eftersom vi använder en löpande summa för att beräkna SMA. För att starta måste vi beräkna den första perioden som vi kallar frö här. Sedan beräknar vi varje efterföljande värde från det ackumulerade fröet va Lue För att göra det behöver vi det gamla värdet som är t-delta och det nyaste värdet för vilket vi sitter ihop serien, en gång från början och en gång förskjutet av deltaet. I slutet gör vi en del rengöring genom att lägga till nollor för längden Av den första perioden och lägger till det ursprungliga frövärdet. Svarade den 19 juni kl. 22 58. Om den här koden är avgörande, kan det vara meningsfullt att undvika heaptilldelning för ljus s. Jag tycker att det mest rimliga sättet att göra det skulle vara Göra ljus i en struktur. Även om mutable värde typer är onda så jag skulle också refactor ljus att vara oföränderlig Detta innebär också att implementering av newestCandle skulle behöva bytas, förmodligen till ett par dubbla fält eller alternativt en separat mutable och återställbar klass . Jag ser inte någon annan potentiell prestationsproblem i din kod. Men när det gäller prestanda bör du alltid lita på profilering, inte din eller någons intuition. Jag tycker inte om några namn på dina metoder. Specific. ValueUpdated Method nam es borde vanligtvis vara i formuläret gör något, inte något hände Så jag tror att ett bättre namn skulle vara UpdateValue. Add Modify Det här är de två grundläggande operationerna i din MovingAverage och jag tror att de namnen inte uttrycker meningen bra, jag skulle kalla dem Något som MoveAndSetCurrent och SetCurrent respektive Även om en sådan namngivning indikerar att de grundläggande operationerna snarare ska vara Flytta och SetCurrent. I har 4000 data i lager och tring för att beräkna det glidande genomsnittet för alla datavärden, men eftersom det glidande genomsnittet är baserat på tidigare data och jag kan inte beräkna 15-dagars SMA för de första 14 dagarna, hoppa över de första 14 dagarna och beräkna SMA på resten av data Och det måste LINQ använda för att åstadkomma Kan någon ge ett prov eller tips hur att använda LINQ för att beräkna glidande medelvärdet. Utgången för genomsnittsvärdena är runt 500 s. Jag förstår verkligen inte hur det är möjligt att få det höga värdet. Att använda medelvärdet med summan array.06 07 2012 562 49 571 72.06 08 2012 565 84 580 32.06 11 2012 568 56 571 17.06 12 2012 569 55 576 16.06 13 2012 570 56 572 16.06 14 2012 570 63 571 53.06 15 2012 571 21 574 13.06 18 2012 572 78 585 78.06 19 2012 573 79 587 41,06 20 2012 574 23 585 74,06 21 2012 574 22 577 67,06 22 2012 575 63 582 10,06 25 2012 576 06 570 77,06 26 2012 576 68 572 03.06 27 2012 576 88 574 50.06 28 2012 576 7 569 05.06 29 2012 576 95 584 00.07 02 2012 578 37 592 52.07 03 2012 579 92 599 41.07 03 2012 581 74 599 41. Ändrad av Leemx fredagen den 16 november 2012 2 59 AM. Av Lisa Zhu Microsofts kontingentpersonal måndag 19 november 2012 7 38 AM linq relaterade från Visual C General. Friday, 16 november 2012 2 42 AM. Till skapa ett glidande medelvärde skulle jag börja med att skapa ett intervall från 0 till längden av datalistan - längden på rörelseperioden och sedan för varje värde i intervallet välj Element x till x längd av rörelseperiod och beräkna medelvärdet. Allt i ett fint LINQ-meddelande. Notera att detta inte är extremt effektivt, eftersom du I grunden iterera över datalistan för varje värde i intervallet. Se, se Detta system tillåter signaturer på mer än 60 cha. Edited av Arno Brouwer Fredagen den 23 november 2012 4 42 PM. Markerat som svar av Alexander Sun fredag ​​den 7 december , 2012 2 44 AM. Friday, 23 november 2012 4 41. Alla svar. Ett urval av ditt LINQ-uttalande skulle hjälpa. Perfekt optimering är roten till allt ont - Knuth. För att skapa ett glidande medelvärde skulle jag börja med att skapa ett intervall från 0 till längden av datalistan - längden på rörelseperioden, sedan för varje värde i intervallet välj element x till x längd av rörelseperiod och beräkna medelvärdet. Allt i ett fint LINQ-meddelande. Notera att detta inte är extremt effektivt , eftersom du i grund och botten repeterar över datalistan för varje värde i intervallet. Se, det här systemet tillåter signaturer på mer än 60 cha. Edited av Arno Brouwer fredagen den 23 november 2012 4 42 PM. Markerad som svar av Alexander Sun fredagen , December 07, 2012 2 44 AM. Friday, 23 november, 2012 4 41. Microsoft genomför en online-undersökning för att förstå din åsikt om Msdn-webbplatsen Om du väljer att delta, kommer onlineundersökningen att presenteras för dig när du lämnar Msdn-webbplatsen. Vill du delta. Hjälp oss att förbättra MSDN. Visa vår UserVoice Sida att skicka in och rösta på idéer. Centra. Lärande resurser.

No comments:

Post a Comment