Tuesday 21 February 2017

Déplacement Moyenne Sans Tableau

Votre interne pour iterating tout le tableau ainsi thats pourquoi vous obtenez toujours la même moyenne (celle pour le tableau entier), vous devriez iterate de 0 au numéro courant de l'externe pour à la place. Votre moyenne mobile est mise à jour en fonction de j de votre intérieur pour que cela signifie qu'il remplace les valeurs précédentes de chaque nouvelle boucle, cela devrait être à l'intérieur de l'extérieur pour au lieu de l'interne en utilisant i comme index. Vous divisez sumj pour calculer des moyennes, chaque nouvelle boucle interne j vous diviserez par 0 la première somme. Je pense que vous avez voulu utiliser j1 à la place, l'index n'est pas le même que la longueur courante Conseils pour résoudre les problèmes: Évitez d'utiliser des variables pour les arrays de boucle, vous devriez utiliser array. length à la place. Pour une question de reproduire votre problème, vous pourriez nous donner le problème isolé au lieu de votre code actuel. À savoir: Imaginez si l'erreur est dans vos entrées, comment pourrions-nous croire que vous les avez vraiment utilisés Vous êtes en boucle sur toutes les données à chaque fois. Vous devriez avoir pour (int j (igtaverageLengthi-averageLength2: 0) jlt iaverageLength2 ampamp jltnumDataPoints j) (ou quelque chose de similaire) pour votre moyenne innermost. En outre, movingAverageisumj devrait être modifié pour traiter le cas où j est 0. En particulier, il devrait probablement être movingAverageisumaverageLength et il doit être appliqué à l'emplacement movingAveragei en dehors de la boucle moyennage. Réponse Oct 4 13 at 20:42 La prochaine fois, prenez les commentaires sur la cession de la question avant de la publier. Mais puisque vous semblez assez nouveau à ce sujet, pensez à la façon dont vous alliez à travers les données, et le faire faire cela. Vous devriez essayer de vous assurer que chaque boucle s'arrête au bon endroit et rappelez-vous que si vous arrêtez quand il n'y a plus de nombres (comme lorsque vous faites la boucle interne et vous ne pouvez obtenir que 3 numéros au lieu de 4) Le programme doit aussi s'arrêter. Assurez-vous que votre code vérifie. Répondre Oct 4 13 at 20:56 Sans aucun détail supplémentaire, vous avez probablement besoin d'une moyenne mobile non pondérée. En tout point Ai dans le tableau d'entrée A de longueur N (avec 0ltiltN), c'est simplement la moyenne des entrées K précédentes du tableau, jusqu'à et y compris Ai. S'il n'y a pas de K telles valeurs, alors la moyenne des valeurs (i1) de A0 à Ai. compris. Un peu de réflexion vous montrera que vous n'avez pas besoin d'ajouter toutes les valeurs de K à chaque fois. Il suffit de garder la somme et, lors du déplacement vers le point suivant (c'est une moyenne mobile), soustraire la valeur qui est remplacé et ajouter la nouvelle valeur qui va le remplacer. (Au cours des premiers points K-1, vous ajoutez simplement la nouvelle valeur à la somme et augmentez votre compteur de 1). À tout moment de ce processus, la moyenne mobile est la somme courante divisée par la valeur de comptage actuelle. Répondre Oct 13 13:05 Dans une moyenne mobile, vous devez avoir une sorte de taille de la fenêtre. La taille de votre fenêtre est moyenne, donc elle ressemblera à ceci: La boucle for démarre à partir des données actuelles et retourne les points de données moyenneLength et les ajoute. Vous aurez seulement une moyenne mobile quand vous avez vous avez quand vous avez assez de points de données et la moyenne sera la somme divisée par la longueur moyenne. Note: Non testé juste le code sudo, mais c'est l'idée. Répondre Oct 4 13 at 21:05 Votre réponse 2017 Stack Exchange, Inc Je sais que cela est réalisable avec boost par rapport à: 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 à un 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, Inc


No comments:

Post a Comment