Je sais que cela est réalisable avec boost selon: Mais je voudrais vraiment éviter d'utiliser boost. J'ai googlé et n'a pas trouvé d'exemples appropriés ou lisibles. Essentiellement, je veux suivre la moyenne mobile d'un flux continu d'un flux de nombres à virgule flottante en utilisant les plus récents numéros 1000 comme un échantillon de données. Quel est le moyen le plus simple pour atteindre ce que j'ai expérimenté avec l'aide d'un tableau circulaire, moyenne mobile exponentielle et une moyenne mobile plus simple et a constaté que les résultats de la matrice circulaire convenait mieux à mes besoins. Si vos besoins sont simples, vous pouvez simplement essayer d'utiliser une moyenne mobile exponentielle. Autrement dit, vous créez une variable d'accumulateur, et comme votre code regarde chaque échantillon, le code met à jour l'accumulateur avec la nouvelle valeur. Vous choisissez un alpha constant qui se situe entre 0 et 1, et calculez ceci: Il vous suffit de trouver une valeur de alpha où l'effet d'un échantillon donné ne dure que pour environ 1000 échantillons. Hmm, je ne suis pas sûr que ce soit approprié pour vous, maintenant que Ive mis ici. Le problème est que 1000 est une fenêtre assez longue pour une moyenne mobile exponentielle Im pas sûr il ya un alpha qui serait la propagation de la moyenne sur les 1000 derniers chiffres, sans underflow dans le calcul en virgule flottante. Mais si vous voulez une moyenne plus petite, comme 30 nombres ou ainsi, c'est une manière très facile et rapide de le faire. A répondu 12 juin à 4:44 1 sur votre poste. La moyenne mobile exponentielle peut permettre à l'alpha d'être variable. Ainsi, cela permet de calculer des moyennes de base de temps (par exemple, des octets par seconde). Si le temps écoulé depuis la dernière mise à jour de l'accumulateur est supérieur à 1 seconde, laissez alpha be 1.0. Sinon, vous pouvez laisser alpha be (usecs depuis la dernière mise à jour1000000). Ndash jxh 12 juin à 6:21 Je veux essentiellement suivre la moyenne mobile d'un flux continu d'un flux de nombres à virgule flottante en utilisant les plus récents numéros 1000 comme un échantillon de données. Notez que la mise à jour ci-dessous le total en tant qu'éléments comme addedreplaced, en évitant coûteux O (N) traversal pour calculer la somme - nécessaire pour la moyenne - sur demande. Le total est fait d'un paramètre différent de T par rapport au support, par ex. En utilisant un long long pour un total de 1000 s longs, un int pour char s, ou un flottant double au total. C'est un peu vicié en ce que les numsamples pourraient dépasser INTMAX - si vous vous inquiétez vous pourriez employer un unsigned long long. Ou utiliser un membre de données bool supplémentaire pour enregistrer quand le conteneur est rempli tout en cyclant numsamples autour du tableau (mieux renommé quelque chose d'inoffensif comme pos). Répondue 12 juin à 5:19 on suppose que l'opérateur quotvoid (échantillon T) est effectivement opérateur quotvoid (T échantillon) quot. Ndash oPless Jun 8 14 at 11:52 oPless ahhh. Bien repéré. En fait, je voulais qu'il soit vide opérateur () (T échantillon), mais bien sûr, vous pouvez utiliser n'importe quelle note que vous avez aimé. Correction, merci. Ndash Tony D Jun 8 14 at 14: 27Il est possible d'implémenter une moyenne mobile en C sans la nécessité d'une fenêtre d'échantillons Ive trouvé que je peux optimiser un peu, en choisissant une taille de fenêtre thats une puissance de deux pour permettre bit - changer au lieu de diviser, mais pas besoin d'un tampon serait bien. Existe-t-il un moyen d'exprimer un nouveau résultat de la moyenne mobile uniquement en fonction de l'ancien résultat et du nouvel échantillon Définir un exemple de moyenne mobile, à travers une fenêtre de 4 échantillons pour être: Ajouter un nouvel échantillon e: Une moyenne mobile peut être implémentée récursivement , Mais pour un calcul exact de la moyenne mobile, vous devez vous souvenir de l'échantillon d'entrée le plus ancien dans la somme (c'est-à-dire l'a dans votre exemple). Pour une longueur N moyenne mobile que vous calculez: où yn est le signal de sortie et xn est le signal d'entrée. Eq. (1) peut être écrit récursivement comme So Il faut toujours se souvenir de l'échantillon xn-N pour calculer (2). Comme l'a souligné Conrad Turner, vous pouvez utiliser une fenêtre exponentielle (infiniment longue) qui vous permet de calculer la sortie uniquement à partir de la sortie passée et de l'entrée courante: mais ce n'est pas une moyenne mobile standard (non pondérée) mais une valeur exponentielle (Au moins en théorie) vous n'oubliez jamais rien (les poids sont de plus en plus petits pour les échantillons loin dans le passé). J'ai mis en œuvre une moyenne mobile sans mémoire élément individuel pour un programme de suivi GPS que j'ai écrit. Je commence par 1 échantillon et diviser par 1 pour obtenir le courant avg. J'ajoute ensuite un autre échantillon et divise par 2 la valeur actuelle. Cela continue jusqu'à ce que j'arrive à la longueur de la moyenne. Chaque fois par la suite, j'ajoute dans le nouvel échantillon, obtenez la moyenne et retirez cette moyenne du total. Je ne suis pas un mathématicien, mais cela semblait être une bonne façon de le faire. J'ai pensé que cela transformerait l'estomac d'un vrai mec de maths, mais il s'avère que c'est l'un des moyens acceptés de le faire. Et ça marche bien. Rappelez-vous juste que plus votre longueur est plus lente, il suit ce que vous voulez suivre. Cela peut ne pas importe la plupart du temps, mais en suivant les satellites, si vous êtes lent, le sentier pourrait être loin de la position réelle et il sera mauvais. Vous pourriez avoir un écart entre le sat et les points de fuite. J'ai choisi une longueur de 15 mise à jour 6 fois par minute pour obtenir un lissage adéquat et ne pas trop loin de la position réelle sat avec les points de sentier lissée. Répondu 16 nov 16 à 23:03 initialiser total 0, count0 (chaque fois que vous voyez une nouvelle valeur Puis une entrée (scanf), un add totalValeur, un incrément (comptage), une moyenne de division (totalcount) Ce serait une moyenne mobile Toutes les entrées Pour calculer la moyenne sur les seules 4 dernières entrées, il faudrait 4 variables d'entrée, peut-être copier chaque entrée à une variable d'entrée plus ancienne, puis calculer la nouvelle moyenne mobile comme somme des 4 variables d'entrée, divisée par 4 Bon si toutes les entrées étaient positives pour rendre le calcul moyen répondu Feb 3 15 à 4:06 Cela va effectivement calculer la moyenne totale et PAS la moyenne mobile. 3 15 at 13:53 Votre réponse 2017 Stack Exchange, IncC algorithme de latence nulle exponentielle moyenne mobile Dernière mise à jour: 2012-08-13 J'ai essayé de mettre en œuvre une coupure basse fréquence en c qui prend essentiellement un flux de nombres et lisse La sortie (filtrage de mouvement de haute fréquence), mais il est important que les nombres pondérés avant sont considérés immédiatement comme les données est temps critique (il est de contrôler une base de simulation de mouvement en utilisant la sortie d'un peu de logiciel de jeu). Ive a obtenu un algorithme de moyenne mobile pondérée de travail mais pourrait faire avec quelque chose un peu plus sensible à l'extrémité avant, et j'ai trouvé ceci: - Le pseudo-code y est comme suit: Entrées: Prix (NumericSeries), Période (NumericSimple) Variables: (0), retard (0) si CurrentBar lt 1 commence alors ZLEMA Facteur de prix 2 (Period1) lag (Période-1) 2 fin else begin Facteur ZLEMA (2Price-Pricelag) (1-facteur) ZLEMA1 end Ive translated it in À C et mon code est comme suit: Cependant, il ne semble pas se comporter tout à fait comme l'espère. Il semble être presque là, mais parfois, je obtenir une valeur légèrement inférieure à tous les éléments de la file d'attente (quand ils sont tous plus élevés). Ma file d'attente et le nombre d'éléments sont passés comme paramètres, le plus récent étant à l'avant en tout temps, aussi je passe un compteur d'incrémentation commençant à 0 comme requis par la fonction. Im pas sûr Ive interprété la signification de ZLEMA1 correctement comme il n'est pas clair dans son pseudocode, donc j'ai supposé que ce soit les derniers appels zlema et aussi Im en supposant que le prix signifie réellement Price0. Peut-être que j'ai eu ce tort Est-ce que je suis censé être la copie des valeurs réelles zlema calculé retour à ma file d'attente d'origine avant le prochain appel Je ne changez pas la file d'attente d'origine à tous les autres que simplement déplacer toutes les valeurs un à la fin et insérer le dernier au début . Le code que j'utilise pour faire ceci est: Serait extrêmement reconnaissant si quelqu'un avec une meilleure compréhension des mathématiques pourrait s'il vous plaît santé vérifier cela pour moi de voir si j'ai eu quelque chose légèrement mal Merci si longtemps à l'avance si vous pouvez aider Tout d'abord grâce à tous pour Votre entrée, très appréciée Cela fait sens je devine, donc je suppose que le meilleur que je peux espérer est simplement une moyenne mobile exponentielle, en acceptant il y aura un peu de retard, mais ce sera minimisé par la pondération plus lourde avant que donné en typés pondérés Moyenne mobile J'ai cet algorithme aussi, mais un problème similaire en ce que les valeurs ne semblent pas tout à fait correct (sauf si c'est la nature de la formule). Par exemple, disons que mon tableau contient 16 valeurs, toutes les 0.4775 - la sortie est 0.4983, mais je m'attends à ce qu'il soit 0.4775 Est-ce que cela vous regarde bien. Moyenne mobile exponentielle. Float ema (float vals, int numVals, int currentSample) facteur de flottement statique 0 static float lastema 0 float ema si (currentSample lt 1) ema vals0 facteur 2.0 ((float) numVals) 1.0) else ema (factor vals0) - facteur) lastema) lastema ema return ema Inversement, parfois la sortie est inférieure à chacune des entrées, même si tous sont plus élevés. Il est appelé de la même manière que zlema (.) Ci-dessus, avec un compteur d'incrémentation. La formule et le pseudocode pour celui-ci sont ici: - autotradingstrategy. wordpress20091130exponential-moving-average Merci encore, excuses pour mon malentendu de certaines des bases :( Cordialement, Chris J En ce qui concerne le code que j'ai posté, vous avez raison sur la taille du tableau En ce qui concerne vos questions: 1) La constante de filtre représente une coupure de fréquence. J'ai utilisé un Digital Signal Processing (DSP) pour cette technique. Fr. wikipedia. orgwi kiLow-pas sfilter est une explication simple. Vous voulez la section Réalisation de temps discret. Dans mon cas, le A est le RC-Constant dont ils parlent. Ainsi, la fréquence de coupure est supérieure à 1 (2piA). Si vous n'avez pas une compréhension de la théorie du domaine fréquentiel, cela peut devenir compliqué. Dans votre cas, plus vous faites de A, plus la fréquence que ce filtre va permettre, c'est-à-dire qu'elle lisse la courbe de plus en plus. Plus vous le faites, plus le bruit est permis dans le système. Rappelez-vous que A doit être supérieur ou égal à 1 pour être efficace. J'ai rattaché de nouveau le XLS, cette fois sans les numéros changeants de rand (). Réglez la constante A et regardez comment il quotsmoothsquot (ou des filtres) sur les variations de haute fréquence. 2) Le dernier point du tableau d'entrée a la valeur la plus récente. 3) Il en va de même pour le tableau de sortie. La dernière est la valeur la plus récente. 5) Le NUMVALS est arbitraire. Vous pouvez continuellement ajouter sur le tableau d'entrée et de sortie autant de fois que youd comme et il wouldnt effet le filtre. En particulier, j'ai utilisé 49 points. Mais je peux facilement supprimer les 20 dernières et les 29 premières sorties restent les mêmes. La fonction n'est pas basée sur le nombre de points utilisés. Je voudrais mentionner que j'ai développé cette fonction pour une conversion ponctuelle. Si vous voulez faire une conversion pour la prochaine valeur à la volée, vous pouvez essayer quelque chose de plus simple (comme ci-joint). Encore une fois rouillée sur c. J'espère que c'est juste. La seule chose que vous devez fournir est la constante d'entrée et de filtre. Faites-moi savoir si cela aide. Moyennes moyennes mobiles simples Moyenne mobile simple Vous êtes encouragé à résoudre cette tâche en fonction de la description de la tâche, en utilisant n'importe quelle langue que vous connaissez peut-être. Calcul de la moyenne mobile simple d'une série de nombres. Créer un stateclassstance stateful qui prend une période et retourne une routine qui prend un nombre comme argument et renvoie une simple moyenne mobile de ses arguments jusqu'à présent. Une moyenne mobile simple est une méthode pour calculer une moyenne d'un flux de nombres en faisant seulement la moyenne des derniers 160 P 160 numéros du flux 160, où 160 P 160 est connu comme la période. Il peut être implémenté en appelant une routine d'initialisation avec 160 P 160 comme argument, 160 I (P), 160 qui doit alors retourner une routine qui, lorsqu'elle est appelée avec des membres individuels, successifs d'un flux de nombres, calcule la moyenne de À), les derniers 160 P 160 d'entre eux, appelle ce 160 SMA (). Le mot 160 état 160 dans la description de la tâche fait référence à la nécessité pour 160 SMA () 160 de se souvenir de certaines informations entre les appels: 160 La période, 160 P 160 Un conteneur commandé d'au moins les derniers 160 P 160 numéros de chacun des Ses appels individuels. L'état 160 signifie également que les appels successifs à 160 I (), 160 l'initialiseur, 160 doivent renvoyer des routines distinctes qui ne 160 ne 160 part épargné état de sorte qu'ils pourraient être utilisés sur deux flux de données indépendantes. Le pseudo-code pour une implémentation de 160 SMA 160 est: Cette version utilise une file d'attente persistante pour contenir les valeurs p les plus récentes. Chaque fonction renvoyée par init-moving-average a son état dans un atome contenant une valeur de file d'attente. Cette implémentation utilise une liste circulaire pour stocker les nombres dans la fenêtre au début de chaque pointeur d'itération se rapporte à la cellule de liste qui retient la valeur qui vient de sortir de la fenêtre et d'être remplacée par la valeur juste ajoutée. Utiliser une fermeture edit Actuellement, ce sma cant être nogc parce qu'il alloue une fermeture sur le tas. Une analyse d'échappement pourrait supprimer l'allocation de tas. Utilisation d'un éditeur de structure Cette version évite l'allocation de mémoire de la mémoire de fermeture en gardant les données dans le cadre de pile de la fonction principale. Même sortie: pour éviter que les approximations en virgule flottante ne s'accumulent et ne se multiplient, le code peut effectuer une somme périodique sur l'ensemble du réseau circulaire de files d'attente. Cette implémentation produit deux objets (fonction) partageant l'état. Il est idiomatique dans E de séparer l'entrée de la sortie (lire à partir de l'écriture) plutôt que de les combiner en un seul objet. La structure est la même que la mise en œuvre de la norme DeviationE. Le programme d'élixir ci-dessous génère une fonction anonyme avec une période intégrée p, qui est utilisée comme la période de la moyenne mobile simple. La fonction d'exécution lit l'entrée numérique et la transmet à la fonction anonyme nouvellement créée, puis inspecte le résultat à STDOUT. La sortie est montrée ci-dessous, avec la moyenne, suivie de l'entrée groupée, constituant la base de chaque moyenne mobile. Erlang a des fermetures, mais des variables immuables. Une solution consiste alors à utiliser des processus et un simple message passant API basée. Les langages matriciels ont des routines pour calculer les avarages de glisse pour une séquence donnée d'items. Il est moins efficace de boucler comme dans les commandes suivantes. Demande continuellement une entrée I. Qui est ajouté à la fin d'une liste L1. L1 peut être trouvé en appuyant sur 2ND1, et la moyenne peut être trouvée dans ListOPS Appuyez sur ON pour terminer le programme. Fonction qui retourne une liste contenant les données moyennées de l'argument fourni. Programme qui retourne une valeur simple à chaque invocation: list est la moyenne de la liste: p est la période: 5 renvoie la liste moyenne: Exemple 2: Utilisation du programme movinav2 , 5) - Initialisation du calcul de la moyenne mobile, et définition de la période de 5 movinav2 (3, x): x - nouvelles données dans la liste (valeur 3), et le résultat sera stocké sur la variable x et affiché movinav2 (4, : X - nouvelles données (valeur 4), et le nouveau résultat sera stocké sur la variable x, et affiché (43) 2. Description de la fonction movinavg: variable r - est le résultat (la liste moyennée) qui sera retournée variable i - est la variable d'index, et elle pointe vers la fin de la sous-liste la liste en cours de moyenne. Variable z - une variable helper La fonction utilise la variable i pour déterminer quelles valeurs de la liste seront prises en compte dans le calcul suivant. A chaque itération, la variable i pointe vers la dernière valeur de la liste qui sera utilisée dans le calcul moyen. Donc nous avons seulement besoin de déterminer quelle sera la première valeur dans la liste. Habituellement, il faut considérer p éléments, donc le premier élément sera celui indexé par (i-p1). Cependant, lors des premières itérations, le calcul sera généralement négatif, de sorte que l'équation suivante évitera les indices négatifs: max (i-p1,1) ou, en organisant l'équation, max (i-p, 0) 1. Mais le nombre d'éléments sur les premières itérations sera également plus petit, la valeur correcte sera (index fin - début indice 1) ou, en organisant l'équation, (i - (max (ip, 0) 1), puis , (I-max (ip, 0)). La variable z détient la valeur commune (max (ip), 0) de sorte que le débutindex sera (z1) et les numberofelements seront (iz) mid (list, z1, iz) renverra la liste de valeur qui sera moyennée sum ( (S) (s) (s) (s) (s) (s) r (s)
No comments:
Post a Comment