Przenoszenie średniej w języku c
Czy możliwe jest zaimplementowanie średniej ruchomej w C bez potrzeby okna z próbkami, które mogę zoptymalizować nieco, wybierając rozmiar okna, który ma potęgę dwóch, aby umożliwić przesunięcie bitowe zamiast dzielenia, ale niewymagające bufor byłby miły. Czy istnieje sposób wyrażenia nowego wyniku średniej kroczącej tylko jako funkcję starego wyniku i nowej próbki Zdefiniuj przykładową średnią ruchomą w oknie 4 próbek: Dodaj nową próbkę e: Średnia ruchoma może zostać zaimplementowana rekurencyjnie , ale do dokładnego obliczenia średniej ruchomej trzeba zapamiętać najstarszą próbkę wejściową w sumie (tj. a w twoim przykładzie). Dla długości N średniej ruchomej obliczamy: gdzie yn jest sygnałem wyjściowym, a xn jest sygnałem wejściowym. Eq. (1) może być napisany rekurencyjnie jako Więc zawsze musisz zapamiętać próbkę xn-N w celu obliczenia (2). Jak wskazał Conrad Turner, można zamiast tego użyć (nieskończenie długiego) okna wykładniczego, które pozwala obliczyć wyjście tylko z poprzedniego wyjścia i bieżącego wejścia: ale nie jest to standardowa (nieważona) średnia ruchoma, ale wykładniczo ważona średnia ruchoma, gdzie próbki w przeszłości mają mniejszą masę, ale (przynajmniej teoretycznie) nigdy niczego nie zapominasz (ciężary stają się mniejsze i mniejsze dla próbek daleko w przeszłości). Zaimplementowałem średnią ruchomą bez pamięci pojedynczych elementów dla programu do śledzenia GPS, który napisałem. Zaczynam od 1 próbki i dzielę przez 1, aby uzyskać aktualną średnią. Następnie dodaję próbkę anothe i dzielę przez 2 do aktualnej avg. To trwa, dopóki nie osiągnę długości średniej. Za każdym razem dodawam nową próbkę, otrzymuję średnią i usuwam tę średnią z całości. Nie jestem matematykiem, ale wydawało mi się, że to dobry sposób. Pomyślałem, że to zmieni żołądek prawdziwego matematyka, ale okazuje się, że jest to jeden z akceptowanych sposobów robienia tego. I działa dobrze. Pamiętaj tylko, że im większa długość, tym wolniej podążasz za tym, co chcesz obserwować. To może nie mieć większego znaczenia, ale gdy podążamy za satelitami, jeśli jesteś wolny, trasa może być daleko od aktualnej pozycji i będzie wyglądać źle. Możesz mieć przerwę między sob i końcowymi kropkami. Wybrałem długość 15 aktualizacji 6 razy na minutę, aby uzyskać odpowiednie wygładzenie i nie za bardzo oddalić się od faktycznej pozycji siedzącej z wygładzonymi kropkami. odpowiedziała 16 listopada 16 o 23:03 zainicjalizuj całość 0, count0 (za każdym razem, gdy zobaczysz nową wartość Następnie jedno wejście (scanf), jedno dodaj totalnewValue, jeden przyrost (count), jedna średnia dzieląca (totalcount) Byłaby to średnia ruchoma ponad wszystkie wejścia Aby obliczyć średnią tylko z ostatnich 4 wejść, wymagałyby 4 zmiennych wejściowych, być może skopiowania każdego wejścia do starszej zmiennej wejściowej, a następnie obliczenia nowej średniej ruchomej jako sumy 4 zmiennych wejściowych, podzielonej przez 4 (prawe przesunięcie 2 byłoby dobrze, jeśli wszystkie dane wejściowe były dodatnie, aby uzyskać średnią obliczoną odpowiedź 3 lutego 15 o 4:06 To faktycznie obliczyć całkowitą średnią, a NIE średnią ruchomą. Jak liczba staje się większa wpływ nowej próbki wejściowej staje się znikały małe ndash Hilmar lutego 3 15 at 13:53 Twoja wymiana stosów w 2017 r. Inc. Wiem, że jest to możliwe dzięki zwiększeniu liczby na: Ale naprawdę chciałbym uniknąć stosowania boost. Mam google i nie znalazłem żadnych odpowiednich lub czytelnych przykładów. Zasadniczo chcę śledzić w ruchu średnia z ciągłego strumienia strumienia liczb zmiennoprzecinkowych z wykorzystaniem najnowszych 1000 liczb jako próbki danych. Jaki jest najłatwiejszy sposób, aby to osiągnąć? Eksperymentowałem z użyciem okrągłej tablicy, wykładniczej średniej kroczącej i prostszej średniej ruchomej, i odkryłem, że wyniki z okrągłej macie najlepiej pasują do moich potrzeb. Zapytany 12 czerwca 12 o 4:38 Jeśli twoje potrzeby są proste, możesz po prostu spróbować użyć wykładniczej średniej kroczącej. Mówiąc prościej, tworzysz zmienną akumulatora, a ponieważ twój kod wygląda na każdą próbkę, kod aktualizuje akumulator o nową wartość. Wybierasz stałą alfa, która jest pomiędzy 0 a 1, i obliczasz to: Musisz tylko znaleźć wartość alfa, gdzie efekt danej próbki trwa tylko około 1000 próbek. Hmm, nie jestem właściwie pewien, czy ci to pasuje, teraz, kiedy go tu umieściłem. Problem polega na tym, że 1000 to dość długie okno dla wykładniczej średniej kroczącej Nie jestem pewien, czy istnieje alfa, które rozłożyłoby średnią z ostatnich 1000 liczb, bez dolnego limitu w obliczeniach zmiennoprzecinkowych. Ale jeśli chcesz mieć mniejszą średnią, na przykład około 30 numerów, jest to bardzo łatwy i szybki sposób na zrobienie tego. odpowiedź 12 czerwca 12 o 4:44 1 na twój post. Wykładnicza średnia ruchoma może pozwolić na zmienną alfa. Dzięki temu można go wykorzystać do obliczenia średniej podstawy czasu (na przykład bajtów na sekundę). Jeśli czas od ostatniej aktualizacji akumulatora jest dłuższy niż 1 sekunda, zezwalasz alfa na 1.0. W przeciwnym razie możesz pozwolić na alfa (usecs od ostatniej aktualizacji1000000). ndash jxh 12 czerwca 12 o 6:21 Zasadniczo chcę śledzić średnią ruchomą ciągłego strumienia strumienia liczb zmiennoprzecinkowych z wykorzystaniem najnowszych 1000 liczb jako próbki danych. Zauważ, że poniższe aktualizacje aktualizują sumę jako elementy dodane z powrotem, unikając kosztownego przejścia przez O (N) w celu obliczenia sumy - potrzebnej dla średniej - na żądanie. Total otrzymuje inny parametr od T do obsługi np. użycie długiej długości, gdy suma wynosi 1000 długich s, int dla char s lub double do total float s. Jest to trochę wadliwe, ponieważ liczba poprawek może przekroczyć INTMAX - jeśli chcesz, możesz użyć długiej długości bez znaku. lub użyj dodatkowego elementu danych typu bool, aby zarejestrować, kiedy pojemnik jest pierwszy wypełniony, podczas gdy liczba próbkowania w cyklu wokół tablicy (najlepiej wtedy przemianowana na coś nieszkodliwego jak pos). odpowiedź 12 czerwca 12 o 5:19 zakłada się, że quotvoid operator (T sample) quot jest w rzeczywistości quotvoid operatorltlt (T sample) quot. ndash oPless cze 8 14 o 11:52 o Bez ahhh. dobrze zauważył. faktycznie miałem na celu unieważnienie operatora () (próbka T), ale oczywiście można użyć dowolnej notacji, którą lubisz. Naprawię, dzięki. ndash Tony D cze 8 14 o 14: 27 Mam 4000 danych ilościowych i tring do obliczenia średniej ruchomej dla wszystkich wartości danych, ale ponieważ średnia krocząca jest oparta na poprzednich danych i nie mogę obliczyć 15-dniowego SMA dla pierwsze 14 dni, pomiń pierwsze 14 dni i obliczyć SMA w pozostałych danych. I musi to być użycie LINQ do wykonania. Czy ktoś może dać próbki lub wskazówkę, jak używać LINQ do obliczania średniej ruchomej Wyjście dla wartości średnich to około 500s Naprawdę nie rozumiem, jak to jest możliwe, aby uzyskać tak wysoką wartość. Przenoszenie uśredniającego z kwotami tablicy: 06072017 562,49 571,72 06082017 565,84 580,32 06112017 568,56 571,17 06122017 569,55 576,16 06132017 570,56 572,16 06142017 570,63 571,53 06152017 571,21 574,13 06182017 572,78 585,78 06192017 573,79 587,41 06202017 574,23 585,74 06212017 574,22 577,67 06222017 575,63 582,10 06252017 576,06 570,77 06262017 576,68 572,03 06272017 576,88 574.50 06282017 576,7 569,05 06292017 576,95 584 00 07022017 578,37 592,52 07032017 579,92 59,41 07032017 581,74 599,41 Pod redakcją Leemx Piątek, 16 listopada 2017 2:59 AM Przeniesiony przez Lisa Zhu Microsoft Zastępczy personel Poniedziałek, 19 listopada 2017 7:38 AM linq related (From : Visual C General) Piątek, 16 listopada 2017 2:42 AM Aby utworzyć średnią ruchomą, zacznę od utworzenia zakresu od 0 do (długość listy danych - długość okresu ruchomego), a następnie dla każdej wartości w zakresie wybierz elementy od x do x 43 długość okresu ruchomego i obliczyć średnią. Wszystko w jednym, ładnym stwierdzeniu LINQ: Zauważ, że nie jest to wyjątkowo efektywne, ponieważ w zasadzie przeglądasz listę danych dla każdej wartości w zakresie ... Hej, zobacz Ten system pozwala na podpisy ponad 60 cha Edytowane przez Arno Brouwer Piątek, listopad 23, 2017 4:42 PM Oznaczone jako odpowiedź przez Alexander Sun Piątek, 07 grudnia 2017 2:44 AM Piątek, 23 listopada 2017 16:41 Wszystkie odpowiedzi Pomocna byłaby próba Twojego wyciągu LINQ. quotPremature optymalizacja jest źródłem całego evil. quot - Knuth Aby utworzyć średnią ruchomą, zacznę od utworzenia zakresu od 0 do (długość listy danych - długość okresu ruchomego), następnie dla każdej wartości z zakresu wybierz elementy x do x 43 długości okresu ruchu i obliczyć średnią. Wszystko w jednym, ładnym stwierdzeniu LINQ: Zauważ, że nie jest to wyjątkowo efektywne, ponieważ w zasadzie przeglądasz listę danych dla każdej wartości w zakresie ... Hej, zobacz Ten system pozwala na podpisy ponad 60 cha Edytowane przez Arno Brouwer Piątek, listopad 23, 2017 4:42 PM Oznaczona jako odpowiedź przez Alexander Sun Piątek, 07 grudnia 2017 2:44 W piątek, 23 listopada 2017 16:41 Firma Microsoft przeprowadza ankietę online, aby poznać Twoją opinię na temat witryny internetowej Msdn. Jeśli zdecydujesz się wziąć udział, ankieta online zostanie przedstawiona użytkownikowi po opuszczeniu witryny internetowej Msdn. Chcesz wziąć udział Pomóż nam ulepszyć MSDN. Odwiedź naszą stronę UserVoice, aby przesyłać i głosować na pomysły Centra deweloperów Zasoby edukacyjne
Comments
Post a Comment