Monday, 13 February 2017

Moyenne Circulaire

Voici une toute autre suggestion - j'essayais de le rendre mieux, plutôt que plus lisible. Le problème avec votre code actuel est qu'il résume de nombreux nombres encore et encore, quand il n'est pas vraiment nécessaire. Comparaison des deux approches après le code d'implémentation. Im additionner un groupe pour la première fois, puis en soustrayant la queue et en ajoutant la tête, encore et encore: Et voici les tests de vitesse, en comparant l'approche de recalcul complet par rapport à celui-ci: Foo1 étant O (nm) et Foo2 est O (nm) son vraiment pas surprenant que la différence est énorme. Résultats sur cette échelle pas vraiment folle: Les résultats sont égaux: True Foo1: 5,52 secondes Foo2: 61,1 millisecondes Et sur une plus grande échelle (remplacé 1000 avec 10000 sur les deux itérations et compter): Foo1: Arrêté après 10 minutes. Foo2: 6.9 secondes Je sais que cela est réalisable avec boost comme par: 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: 27Je dispose d'une quantité de 4000 données de stock, et tring pour calculer la moyenne mobile pour toutes les valeurs de données, mais puisque la moyenne mobile est basée sur les données précédentes et je ne peux pas calculer le SMA de 15 jours pour Les 14 premiers jours, sauter les 14 premiers jours et calculer le SMA sur le reste des données. Et il doit utiliser LINQ pour accomplir. Est-ce que n'importe qui peut donner un échantillons ou un indice comment à l'aide de LINQ pour calculer la moyenne mobile La sortie pour les valeurs moyennes sont toutes autour de 500s je ne comprends vraiment pas comment est-ce possible pour obtenir cette valeur élevée. Déplacement moyenneur avec des sommes tableau: 06072012 562,49 571,72 06082012 565,84 580,32 06112012 568,56 571,17 06122012 569,55 576,16 06132012 570,56 572,16 06142012 570,63 571,53 06152012 571,21 574,13 06182012 572,78 585,78 06192012 573,79 587,41 06202012 574,23 585,74 06212012 574,22 577,67 06222012 575,63 582,10 06252012 576,06 570,77 06262012 576,68 572,03 06272012 576,88 574.50 06282012 576.7 569.05 06292012 576.95 584.00 07022012 578.37 592.52 07032012 579.92 599.41 07032012 581.74 599.41 Modifié par Leemx vendredi 16 novembre 2012 02:59 Proposé par Lisa Zhu Personnel des contingents Microsoft lundi 19 novembre 2012 07:38 linq related (From : Visual C Général) Friday, November 16, 2012 2:42 AM Pour créer une moyenne mobile, je commencerais par créer une plage de 0 à (longueur de la liste de données - longueur de la période de déplacement), puis pour chaque valeur dans la plage Sélectionner les éléments x à x 43 la longueur de la période de déplacement et calculer la moyenne. Tout en un beau LINQ déclaration: Notez que ce n'est pas très efficace, car vous essentiellement itérer sur la liste des données pour chaque valeur dans la gamme .. Hé, regardez Ce système permet des signatures de plus de 60 cha. Modifié par Arno Brouwer Vendredi, Novembre 23, 2012 4:42 PM Marqué comme réponse par Alexander Sun Vendredi, Décembre 07, 2012 2:44 AM vendredi 23 novembre 2012 4:41 PM Toutes les réponses Un exemple de votre déclaration LINQ serait utile. Pour créer une moyenne mobile, je commencerais par créer une plage de 0 à (longueur de la liste de données - longueur de la période de déplacement), puis pour chaque valeur dans la gamme sélectionner les éléments x À x 43 la durée de la période de déplacement et de calculer la moyenne. Tout en un beau LINQ déclaration: Notez que ce n'est pas très efficace, car vous essentiellement itérer sur la liste de données pour chaque valeur dans la gamme .. Hé, regardez Ce système permet des signatures de plus de 60 chao Edité par Arno Brouwer Vendredi, Novembre 23, 2012 4:42 PM Marqué comme réponse par Alexander Sun Friday, December 07, 2012 2:44 AM vendredi 23 novembre 2012 16:41 Microsoft effectue un sondage en ligne pour comprendre votre opinion sur le site Web Msdn. Si vous choisissez de participer, le sondage en ligne vous sera présenté lorsque vous quitterez le site Web Msdn. Souhaitez-vous participer Aidez-nous à améliorer MSDN. Visitez notre page UserVoice pour soumettre et voter sur les idées Centres de développement Ressources d'apprentissage


No comments:

Post a Comment