Saturday 25 February 2017

Qt Moyenne Mobile

Im essayer de retourner un QVector à partir d'une fonction qui est censé calculer la moyenne mobile. Ma question est de savoir comment rendre la fonction plus efficace. Les maths sont très bien, je me demande encore si je fais quelque chose de mal en retournant le QVector. Voici le code que j'ai jusqu'ici: J'utilise le constructeur par défaut pour empêcher le QVector de définir une valeur par défaut. J'ai essayé la même chose avec redimensionner qui est beaucoup plus lent. Avez-vous des suggestions comment cela peut être optimisé Comme vous affirmez que le retour prend plus longtemps, le problème peut ne pas être dans la fonction elle-même, mais sur le site où la valeur retournée est utilisée. Hélas, heres où votre code perd du temps: En allocation du QVector chaque fois que la moyenne est invoquée. On peut supposer qu'il est appelé à plusieurs reprises, il n'est donc pas nécessaire de le faire attribuer un nouveau vecteur à chaque fois. Dans QVector :: opérateur. Il a un peu plus de frais généraux que l'accès au tableau simple, car theres cet appel pesky isDetached fait sur chaque appel à l'opérateur. Dans QVector :: append. Non seulement il appelle isDetached. Mais aussi il contrôle et modifie la longueur ainsi. Notez que theres absolument rien de mal à retourner de votre valeur. C'est une opération banale et prend presque pas de temps. Vous le faites OK quand il s'agit de retourner - et de retour seulement. Mais vous ne nous montrer comment vous utilisez la valeur retournée, donc je ne peux pas vous dire si peut-être vous faites quelque chose de mal là-bas. Pour éviter les allocations répétées et les frais généraux de l'opérateur, vous pouvez utiliser une classe qui conserve un vecteur prêt à être réutilisé et utiliser un pointeur vers des vecteurs-données au lieu d'utiliser le vecteur directement. Pour le faire aller plus vite aurait probablement besoin de l'utilisation de SIMD intrinsics. I savent 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 à 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 à 14: 27QT Study Pack 2006 wip (Page 141-142).doc - 1. Déplacement. 1. Moyenne mobile Données périodiques, p. Les ventes mensuelles peuvent avoir des fluctuations aléatoires chaque mois malgré une tendance générale étant évidente. La moyenne mobile aide à lisser ces changements aléatoires. Une moyenne mobile est la prévision pour une période qui prend la moyenne des périodes précédentes. Pour les données Mois Ventes Janvier 1200 plusmnebruary 1280 Mars 1310 Avril 1270 Mai 1190 Juin 1290 Juillet 1410 Août 1360 Septembre 1430 Octobre 1280 Novembre 1410 Décembre 1390 Solution. Le tableau ci-dessous représente les ventes de l'entreprise, calcule 3 et 6 mensuelles moyennes mobiles. Ceux-ci sont calculés comme suit. Cet aperçu a délibérément des sections floues. Inscrivez-vous pour voir la version complète. Aprilrsquos prévisions Jan Feb Mar 3 120012801310 3 Mayrsquos prévisions Février Mar Avr 3 128013101270 3 Et donc onhellip De même pour 6 mensuelle moyenne mobile Juillet Février MarAprMay Juin 6 120012801310127011901290 6 Et ainsi onhellip 3 mois de moyenne mobile 6 mois de moyenne mobile Avril 1263 Mai 1287 Juin 1257 Juillet 1250 1257 Août 1297 1292 Septembre 1353 1305 Octobre 1400 1325 Novembre 1357 1327 Décembre 1373 1363 Note: Lorsqu'on calcule la moyenne mobile sur les graphiques, les points sont tracés comme le point médian de la période de la moyenne, par exemple Dans notre exemple la prévision Cet aperçu a délibérément des sections floues. Inscrivez-vous pour voir la version complète. C'est la fin de l'aperçu. Inscrivez-vous pour accéder au reste du document.


No comments:

Post a Comment