Wednesday, 4 October 2017

Matlab Glidande Medelvärde Utan Slinga


Jag försöker slutföra ett matlab-uppdragsprojekt med följande fråga: Skriv en funktion som heter movingaverage som tar en skalär som heter x som ett inmatningsargument och returnerar en skalär. Funktionen använder en buffert för att hålla tidigare ingångar, och bufferten kan hålla högst 25 ingångar. Specifikt måste funktionen spara de senaste 25 ingångarna i en vektor (bufferten). Varje gång funktionen kallas kopierar den inmatningsargumentet till ett element i bufferten. Om det redan finns 25 ingångar lagrade i bufferten, kasserar den det äldsta elementet och sparar den nuvarande i bufferten. När den har lagrat inmatningen i bufferten returnerar den medelvärdet av alla element i bufferten. Lösningen jag tillhandahåller är följande: Enligt auto grader fungerar min funktion korrekt när värdena 1-50 passerar i följd men misslyckas när värdena på en högljudd sinusvåg passerar i följd (vilket jag har blivit informerad om som kan bero på vissa slags avrundningsfel). Jag skulle vara tacksam om någon av er kunde ge mig några tips om eventuella felsteg i min kod (bifogad ovan). Tack på förhand Jag behöver beräkna ett glidande medelvärde över en dataserie, inom en för loop. Jag måste få det glidande genomsnittet över N9 dagar. Array Im computing in är 4 serier av 365 värden (M), som i sig är medelvärden för en annan uppsättning data. Jag vill räkna ut medelvärdena för mina data med glidande medelvärde i en plot. Jag googled lite om glidande medelvärden och conv kommandot och hittade något som jag försökte implementera i min kod .: Så i princip beräknar jag mitt medelvärde och plottar det med ett (fel) glidande medelvärde. Jag valde wts-värdet direkt utanför mathworks webbplats, så det är felaktigt. (källa: mathworks. nlhelpeconmoving-average-trend-estimation. html) Mitt problem är dock att jag inte förstår vad det här är. Kan någon förklara om det har något att göra med värdena på värdena: det är ogiltigt i det här fallet. Alla värden är viktade samma. Och om jag gör det här helt fel, kan jag få lite hjälp med det mitt uppriktiga tack. frågade 23 sep 14 kl 19:05 Använda conv är ett utmärkt sätt att genomföra ett glidande medelvärde. I koden du använder är wts hur mycket du väger varje värde (som du gissade). Summan av den vektorn ska alltid vara lika med en. Om du vill vikta varje värde jämnt och göra ett N-rörligt filter så skulle du vilja göra Att använda det giltiga argumentet i conv resulterar i att få färre värden i Ms än du har i M. Använd samma om du inte har något emot effekterna av noll padding. Om du har signalbehandlingsverktygslådan kan du använda cconv om du vill prova ett cirkulärt glidande medelvärde. Något som om du borde läsa dokumentet för conv and cconv för mer information om du inte redan har hämtat. Ladda ner movAv. m (se också movAv2 - en uppdaterad version som tillåter viktning) Beskrivning Matlab innehåller funktioner som kallas movavg och tsmovavg (tidsserie glidande medelvärde) i Financial Toolbox, movAv är utformad för att replikera den grundläggande funktionaliteten för dessa. Koden här ger ett bra exempel på hantering av index inom slingor, vilket kan vara förvirrande till att börja med. Ive hålls medvetet koden kort och enkel att hålla processen klar. movAv utför ett enkelt glidande medelvärde som kan användas för att återställa bullriga data i vissa situationer. Det fungerar genom att ta en medelvärde av ingången (y) över ett glidande tidfönster, vars storlek anges av n. Ju större n är, desto större blir utjämningen av effekten av n i förhållande till längden på ingångsvektorn y. Och effektivt (bra slags) skapar ett lågpassfrekvensfilter - se avsnittet exempel och överväganden. Eftersom mängden utjämning som tillhandahålls av varje värde av n är relativt längden på ingångsvektorn, är det alltid värt att testa olika värden för att se vad som är lämpligt. Kom också ihåg att n poäng går förlorade vid varje genomsnitt om n är 100, innehåller de första 99 punkterna i ingångsvektorn inte tillräckligt med data för ett 100pt-medelvärde. Detta kan undvikas något genom att stapla medelvärden, till exempel koden och grafen nedan jämför ett antal olika längdfönstermedelvärden. Lägg märke till hur jämn 1010pt jämförs med ett enda 20pt-medelvärde. I båda fallen förloras totalt 20 data. Skapa xaxis x1: 0.01: 5 Generera ljudstråleReps 4 brusrepmat (randn (1, ceil (numel (x) noiseReps)), noiseReps, 1) brusreform (brus, 1, längd (brus) noiseReps) Generera ydata noise yexp X) 10noise (1: längd (x)) Per genomsnittvärden: y2 movAv (y, 10) 10 pt y3 movAv (y2, 10) 1010 pt y4 movAv (y, 20) 20 pt y5 movAv (y, 40) 40 pt Y6 movAv (y, 100) 100 pt Plottbildsplot (x, y, y2, y3, y4, y5, y6) legend (Rådata, 10pt glidande medelvärde, 1010pt, 20pt, 40pt, 100pt) xlabel (x) ylabel y) titel (Jämförelse av glidande medelvärden) movAv. m-kod genomgångsfunktion output movAv (y, n) Den första raden definierar funktionsnamn, ingångar och utgångar. Inmatningen x borde vara en vektor av data för att utföra medelvärdet, n skulle vara antalet punkter för att utföra medelvärdet över utgången kommer att innehålla den genomsnittliga data som returneras av funktionen. Fördela utgångsutgångNaN (1, numel (y)) Hitta mittpunkten i n midPoint-runda (n2) Funktionens huvuduppgift görs i loopbandet, men innan man börjar startas två saker. För det första fördelas utdelningen som NaNs, detta tjänade två syften. För det första är förallokering i allmänhet god praxis eftersom det minskar minnes jonglering Matlab måste göra, för det andra gör det mycket enkelt att placera den genomsnittliga data i en utmatning som är lika stor som ingångsvektorn. Detta betyder att samma xaxis kan användas senare för båda, vilket är lämpligt för plottning, alternativt kan NaN: erna tas bort senare i en kodlinje (utgångsutgången (Den variabla midPoint kommer att användas för att rikta in data i utmatningsvektorn. n 10, 10 poäng kommer att gå vilse eftersom för de första 9 punkterna av ingångsvektorn finns det inte tillräckligt med data för att ta 10 poäng. Eftersom utmatningen kommer att vara kortare än ingången måste den justeras korrekt. Användas så att en lika stor mängd data går förlorad vid början och slutet, och ingången hålls inriktad med utgången av NaN-buffertarna som skapas vid preallokering av utgången. För en 1: längd (y) - n Hitta indexintervall för att ta medeltal Över (a: b) förbud Beräkna medelvärde (amidpunkt) medelvärde (y (a: b)) slutet I själva loopbandet tas ett medel över varje på varandra följande segment av ingången. Slingan körs för a. definierad som 1 upp till längden på ingången (y), minus data som kommer att gå vilse (n). Om ingången är 100 poäng lo ng och n är 10, kommer slingan att springa från (a) 1 till 90. Detta betyder att det första segmentets index blir genomsnittligt. Det andra indexet (b) är helt enkelt an-1. Så vid första iterationen, a1. N10. så b 11-1 10. Det första genomsnittet tas över y (a: b). Eller x (1:10). Medelvärdet av det här segmentet, som är ett enda värde, lagras i utgången på index amidPoint. Eller 156. Vid den andra iterationen, a2. B 210-1 11. så medelvärdet tas över x (2:11) och lagras i utgången (7). Vid den sista iterationen av slingan för en ingång av längd 100, a91. B 9010-1 100 så medelvärdet tas över x (91: 100) och lagras i utgången (95). Detta lämnar utdata med totalt n (10) NaN-värden vid index (1: 5) och (96: 100). Exempel och överväganden Flytta medelvärden är användbara i vissa situationer, men de är inte alltid det bästa valet. Här är två exempel där de inte nödvändigtvis är optimala. Mikrofonkalibrering Denna uppsättning data representerar nivåerna för varje frekvens som produceras av en högtalare och spelas in av en mikrofon med känt linjärt svar. Högtalarens utgång varierar med frekvens, men vi kan korrigera för denna variation med kalibreringsdata - utgången kan justeras på nivå för att beräkna fluktuationerna i kalibreringen. Observera att rådata är bullriga - det betyder att en liten förändring i frekvens tycks kräva en stor, oregelbunden nivåförändring för att redovisa. Är detta realistiskt eller är det här en produkt av inspelningsmiljön. Det är rimligt att i detta fall tillämpa ett glidande medelvärde som släpper ut nivåfrekvenskurvan för att ge en kalibreringskurva som är något mindre ojämn. Men varför är det inte optimalt i det här exemplet? Mer data skulle vara bättre - flera kalibreringar körs i genomsnitt tillsammans skulle förstöra bruset i systemet (så länge det är slumpmässigt) och ge en kurva med mindre subtila detaljer som är förlorade. Det rörliga genomsnittet kan bara approximera detta och kan ta bort några högre frekvensdips och toppar från den kurva som verkligen existerar. Sinvågor Med ett rörligt medelvärde på sinusvågor framhävs två punkter: Den allmänna frågan om att välja ett rimligt antal poäng för att utföra medelvärdet över. Det är enkelt, men det finns mer effektiva metoder för signalanalys än genomsnittliga oscillerande signaler i tidsdomänen. I denna graf kartläggs den ursprungliga sinusvågen i blått. Buller läggs till och ritas som apelsinskurvan. Ett glidande medel utförs vid olika antal punkter för att se om den ursprungliga vågen kan återvinnas. 5 och 10 poäng ger rimliga resultat, men tar inte bort ljudet helt, där så större antal punkter börjar förlora amplituddetalj som medeltalet sträcker sig över olika faser (kom ihåg att vågoscillerar runt noll och medelvärdet (-1 1) 0) . Ett alternativt tillvägagångssätt skulle vara att konstruera ett lågpassfilter än vad som kan appliceras på signalen i frekvensdomänen. Jag tänker inte gå in i detalj eftersom det går utöver omfattningen av denna artikel, men eftersom bruset är betydligt högre frekvens än vågens grundläggande frekvens, skulle det vara ganska lätt att i detta fall konstruera ett lågpassfilter än att avlägsna högfrekvensen noise. Exponential Moving Genomsnitt utan för Loop happydude ltanonymoussehotmailgt skrev i meddelande lthe1oepfs61fred. mathworksgt. Gt tack för det här Verkar ganska nära men kan fortfarande vara ganska annorlunda än den traditionella EMA som används i finans. Gt från ett begränsat antal simuleringar verkar det vara ganska annorlunda än EMA för ca 60 datapunkter eller så. Gt gt några idéer varför detta kan hända gt gt nb - den traditionella EMA använder en SMA som ett initialvärde eftersom EMA-formeln kräver ett initialt EMA-värde. Hur går filtreringsfunktionen kring det här Svaret är att filtret inte kommer runt det. För de första 30 poängen kommer filtret att gå utanför framkantskanten av dagensClose-vektorn. Dessa värden förbi kanten är inställda på 0. Detta förvränger åtminstone de första 30 punkterna i din EMA. Du kan se effekten genom att ha ett konstant nära pris. dagens (100,1) 100 dagar tillbaka 30 alfa 2 (dagar tillbaka 1) beräkna utjämningsfaktor alfa-koefficient repmat (1-alfa, 1, dagar tillbaka). (1: daysBack) notera 1-alfa EMA-filter (koefficient, summa (koefficient) , todaysClose) plot (todaysClose) håll på plot (EMA, r) Du kan kasta framkanten av arrayen genom att kopiera värdena för första värdet ut daysBack och sedan ta bort den. Det kan hjälpa till. Så: todaysClose cumsum (randn (100,1)) daysBack 30 pad repmat (todaysClose (1), daysBack, 1) todaysClose padtodaysClose alfa 2 (daysBack 1) beräkna utjämningsfaktor alfakoefficient repmat (1-alfa, 1, daysBack). EMA EMA (31: end) ta bort pjäset (todaysClose (31: end)) håll på plot (EMA, r) tack dåligt (1: daysBack) Note 1-alfa EMA-filter (koefficient, summa Ge det ett skott :) Ämne: Exponentiell Flytta Genomsnitt utan för Loop Från: Bwana happydude ltanonymoussehotmailgt skrev i meddelande lthe3krmglm1fred. mathworksgt. Gt tack sjukt ge det ett skott :) Ämne: Exponentiell rörelse Genomsnitt utan för loop från: david Bwana ltbwana. mukubwagmailgt skrev i meddelande lti1fpb3noh1fred. mathworksgt. Gt happydude ltanonymoussehotmailgt skrev i meddelande lthe3krmglm1fred. mathworksgt. gt gt tack dåligt ge det ett skott :) gt gt all inbyggd: mathworksaccesshelpdeskhelptoolboxfinancetsmovavg. html Vem vet varför den ovan beskrivna filtreringsfunktionen ger en annan effekt än den för den inbyggda movavg-funktionen den 15 mars kl 04:50 david ltdavidtr . Gmailgt skrev: gt Bwana ltbwana. muku. gmailgt skrev i meddelande lti1fpb3no. fred. mathworksgt. gt gtdudu ltanonymou. Hotmailgt skrev i meddelande lthe3krmgl. fred. mathworksgt. gt gt gt tack dåligt ge det ett skott :) gt gt gt alla inbyggda: mathworksaccesshelpdeskhelptoolboxfinancetsmovav. Gt gt Vem vet varför den ovan beskrivna filtreringsfunktionen ger en annan effekt än den för den inbyggda movavg-funktionen min gissning är att det beror på att du har skruvat upp. Men du har inte visat oss din kod, så hur kan vi veta Hej, den andra parametern för filterfunktionen ska vara (1alpha-1) istället för summa (koefficient) kanske. Om du utvidgar den rekursiva formeln för EMA, kommer du att finna det termin. P. S. (1alpha-1) är det värde som summan av koefficienten konvergerar. Varför använder man ett approximativt värde istället för den rätta eller saknar jag något Matthew Whitaker ltmattlwhitakerREMOVEgmailgt skrev i meddelande lthdv98tdcd1fred. mathworksgt. gt försök denna kod: gt daysClose cumsum (randn (100,1)) gt daysBack 30 gt alpha 2 (daysBack 1) beräkna utjämningsfaktor alfa gt koefficient repmat (1-alfa, 1, daysBack). (1: daysBack) not 1 - alpha gt EMA-filter (koefficient, summa (koefficient), daysclose) gt plot (todaysClose) gt håller på gt plot (EMA, r) gt gt Hoppas det här hjälper gt Matt W gt gt gt gt gt happydude ltanonymoussehotmailgt skrev i meddelande lthdv3c35um1fred. mathworksgt. Gt gt Hej, jag försöker hitta den rullande 30-dagars EMA för en tidsserie utan att använda en för loop (jag har mycket data). Gt gt gt Som en provpletest är det något som jag vill ha (nedan) men jag tycker att mitt slutresultat inte är riktigt nära hur det ska se ut. När jag lägger den ihop i Excel eller med en för loop, kommer den ut korrekt men jag är i mörkret om jag använder filteret korrekt nedan. Gt gt gt gt Kan någon hjälpa gt gt gt gtdaysClose cumsum (randn (100,1)) gt gt daysBack 30 gt gt alpha 2 (daysBack 1) beräkna utjämningsfaktor alfa gt gt gt förbereda en koefficient för filterfunktionen gt gt Koefficient-koefficient (koefficient) gt gt gt gt EMA-filter (koefficient, 1, daysclose) gt gt gt gt gt Detta var en av de tjänster som jag tittade upp groups. googlegroupcomp. soft-sys. matlabtreebrowsefrmthread7b5c0b3146432dd958e9d04b885a576arnum11donegroupcomp. soft-sys. matlabbrowsefrmthread7b5c0b3146432dd948bdf7f81cd8f1973Ftvc3D126doca1c5b8de7a7c428a gt gt gt gt detta är också där jag fick ovanstående filterkoden gt gt groups. googlegroupcomp. soft-sys. matlabbrowsethreadthread1d8d10d5b835550dtvc2qexponentialmovingaveragefilter happydude skrev i meddelande lthdv3c35um1fred. mathworksgt. Gt Hej jag försöker hitta den rullande 30-dagars EMA för en tidsserie utan att använda en för loop (jag har mycket data). Gt gt Som en provpletest är det något som jag vill ha (nedan) men jag tycker att mitt slutresultat inte är riktigt nära hur det ska se ut. När jag lägger den ihop i Excel eller med en för loop, kommer den ut korrekt men jag är i mörkret om jag använder filteret korrekt nedan. Gt gt Kan någon hjälpa till med gtdaysdaysClose cumsum (randn (100,1)) gt daysBack 30 gt alfa 2 (daysBack 1) beräkna utjämningsfaktor alfa gt gt laga en koefficient för filterfunktionen gt koefficient repmat (alfa, 1, daysBack) . (1: daysBack) gt koefficient coefficientientsum (koefficient) gt gt EMA filter (koefficient, 1, daysclose) gt gt gt PS detta var en av de tjänster som jag tittade upp groups. googlegroupcomp. soft-sys. matlabtreebrowsefrmthread7b5c0b3146432dd958e9d04b885a576arnum11donegroupcomp. soft-sys. matlabbrowsefrmthread7b5c0b3146432dd948bdf7f81cd8f1973Ftvc3D126doca1c5b8de7a7c428a gt gt det är också där jag fick ovanstående filterkoden gt groups. googlegroupcomp. soft-sys. matlabbrowsethreadthread1d8d10d5b835550dtvc2qexponentialmovingaveragefilter Observera att koefficienterna För tidigare data är inte rätt. Formeln är: Pris (t) alfaPris (t-1) alfa (1-alfa) Pris (t-2) alfa (1-alfa) 2. Pris (t-dygn) (1-alfa) dagarBakkoefficient1 repmat (1-k), 1, N). (1: N).repmat (k, 1, N) 1 Vad är en klocklista Du kan tänka på din bevakningslista som trådar du har bokmärkt. Du kan lägga till taggar, författare, trådar och till och med sökresultat till din bevakningslista. På så sätt kan du enkelt hålla reda på ämnen som du är intresserad av. För att se din tittellista, klicka på quotMy Newsreaderquot-länken. Om du vill lägga till objekt i din bevakningslista klickar du på citadeln för att titta på listotiklänk längst ner på en sida. Hur lägger jag till ett objekt i min vaktlista För att lägga till sökkriterier i din vaktlista, sök efter önskad term i sökrutan. Klicka på citatetLägg till den här sökningen i min klocklistor på länken på sökresultatsidan. Du kan också lägga till en tagg i din bevakningslista genom att leta efter taggen med direktivet quottag: tagnamequot där tagname är namnet på den tagg du vill titta på. För att lägga till en författare till din bevakningslista, gå till författarens profilsida och klicka på quotAddjär den här författaren till min watch listquot-länk högst upp på sidan. Du kan också lägga till en författare till din bevakningslista genom att gå till en tråd som författaren har publicerat och klicka på quotAdd denna författare till min watch listquot link. Du kommer att få besked när författaren gör ett inlägg. Om du vill lägga till en tråd i din bevakningslista går du till trådsidan och klickar på citatetLägg till den här tråden i min larmlista-länk högst upp på sidan. Om nyhetsgrupper, nyhetsläsare och MATLAB Central Vad är nyhetsgrupper Nyhetsgrupperna är ett globalt forum som är öppet för alla. Nyhetsgrupper används för att diskutera ett stort antal ämnen, göra meddelanden och handelsfiler. Diskussionerna är gängade eller grupperade på ett sätt som låter dig läsa ett upplagd meddelande och alla dess svar i kronologisk ordning. Detta gör det enkelt att följa tråden i samtalet och för att se vad du redan har sagt innan du skickar ditt eget svar eller gör ett nytt inlägg. Nyhetsgruppens innehåll distribueras av servrar som är värd av olika organisationer på Internet. Meddelanden utbyts och hanteras med hjälp av öppna standardprotokoll. Ingen enskild enhet ldquoownsrdquo newsgroups. Det finns tusentals nyhetsgrupper som varje adresserar ett enda ämne eller intresseområde. MATLAB Central Newsreader postar och visar meddelanden i comp. soft-sys. matlab-nyhetsgruppen. Hur läser jag eller postar till nyhetsgrupperna Du kan använda den integrerade nyhetsläsaren på MATLAB Central webbplats för att läsa och skicka meddelanden i den här nyhetsgruppen. MATLAB Central är värd MathWorks. Meddelanden som skickas via MATLAB Central Newsreader ses av alla som använder nyhetsgrupper, oavsett hur de kommer åt nyhetsgrupperna. Det finns flera fördelar med att använda MATLAB Central. Ett konto Ditt MATLAB Central-konto är knutet till ditt MathWorks-konto för enkel åtkomst. Använd E-postadressen till ditt val MATLAB Central Newsreader gör att du kan definiera en alternativ e-postadress som din postadress, för att undvika röran i din primära brevlåda och minska spam. Spamkontroll De flesta nyhetsgruppspamfiler filtreras ut av MATLAB Central Newsreader. Taggningsmeddelanden kan märkas med en relevant etikett av någon inloggad användare. Taggar kan användas som nyckelord för att hitta specifika filer av intresse eller som ett sätt att kategorisera dina bokmärkta inlägg. Du kan välja att låta andra se dina taggar, och du kan visa eller söka otherrsquo-taggar såväl som de i samhället som helhet. Tagging ger ett sätt att se både de stora trenderna och de mindre, mer dunkla idéerna och applikationerna. Vaktlistor Med inställning av vallistor kan du få meddelande om uppdateringar gjorda till inlägg som valts av författare, tråd eller någon sökvariabel. Meddelandena om bevakningslistan kan skickas via e-post (dagligen digest eller omedelbar), visas i My Newsreader, eller skickas via RSS-flöde. Andra sätt att komma åt nyhetsgrupperna Använd en nyhetsläsare via din skola, arbetsgivare eller internetleverantör Betala för nyhetsgruppen tillgång från en kommersiell leverantör Använd Google Groups Mathforum. org ger en nyhetsläsare med tillgång till comp. soft sys. matlab-nyhetsgruppen Kör din egen server. För typiska instruktioner, se: slyckng. phppage2 Välj ditt land

No comments:

Post a Comment