Saturday 18 February 2017

Déplacement Moyenne Fonction En C

Est-il possible de mettre en œuvre 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 le décalage de bits au lieu de diviser, mais pas besoin 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 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 à 13:53 Votre réponse 2017 Stack Exchange, IncAVERAGE fonction S'applique à: Excel 2016 Excel 2013 Excel 2010 Excel 2007 Excel 2016 pour Mac Excel pour Mac 2011 Excel Excel pour Excel Excel pour Excel pour iPhone Excel pour tablettes Android Excel Starter Excel Mobile Excel Pour téléphones Android Plus. Moins Cet article décrit la syntaxe de formule et l'utilisation de la fonction MOYENNE dans Microsoft Excel. Description Renvoie la moyenne (moyenne arithmétique) des arguments. Par exemple, si la plage A1: A20 contient des nombres, la formule AVERAGE (A1: A20) renvoie la moyenne de ces nombres. La syntaxe de la fonction AVERAGE a les arguments suivants: Number1 Obligatoire. Le premier numéro, la référence de cellule ou la plage pour laquelle vous voulez la moyenne. Numéro 2. Optionnel. Numéros supplémentaires, références de cellule ou plages pour lesquelles vous voulez la moyenne, jusqu'à un maximum de 255. Les arguments peuvent être des nombres ou des noms, des plages ou des références de cellules contenant des nombres. Les valeurs logiques et les représentations textuelles des nombres que vous saisissez directement dans la liste d'arguments sont comptées. Si une plage ou un argument de référence de cellule contient du texte, des valeurs logiques ou des cellules vides, ces valeurs sont ignorées, mais les cellules de valeur zéro sont incluses. Les arguments qui sont des valeurs d'erreur ou du texte qui ne peuvent pas être traduits en nombres provoquent des erreurs. Si vous souhaitez inclure des valeurs logiques et des représentations textuelles de nombres dans une référence dans le calcul, utilisez la fonction AVERAGEA. Si vous voulez calculer la moyenne de seulement les valeurs qui répondent à certains critères, utilisez la fonction AVERAGEIF ou la fonction AVERAGEIFS. Remarque: La fonction MOYENNE mesure la tendance centrale, qui est l'emplacement du centre d'un groupe de nombres dans une distribution statistique. Les trois mesures les plus courantes de tendance centrale sont: Moyenne. Qui est la moyenne arithmétique, et est calculée en ajoutant un groupe de nombres puis en les divisant par le nombre de ces nombres. Par exemple, la moyenne de 2, 3, 3, 5, 7 et 10 est 30 divisée par 6, qui est 5. Médiane. Qui est le nombre moyen d'un groupe de nombres qui est, la moitié des nombres ont des valeurs qui sont supérieures à la médiane, et la moitié des nombres ont des valeurs qui sont inférieures à la médiane. Par exemple, la médiane de 2, 3, 3, 5, 7 et 10 est 4. Mode. Qui est le nombre le plus fréquent dans un groupe de nombres. Par exemple, le mode de 2, 3, 3, 5, 7 et 10 est 3. Pour une distribution symétrique d'un groupe de nombres, ces trois mesures de tendance centrale sont toutes identiques. Pour une distribution biaisée d'un groupe de nombres, ils peuvent être différents. Conseil: Lorsque vous faites une moyenne de cellules, gardez à l'esprit la différence entre les cellules vides et celles contenant la valeur zéro, surtout si vous avez désactivé la case à cocher Afficher un zéro dans les cellules ayant une valeur nulle dans la boîte de dialogue Options Excel dans le bureau Excel application. Lorsque cette option est sélectionnée, les cellules vides ne sont pas comptées, mais les valeurs zéro sont. Pour localiser la case à cocher Afficher un zéro dans les cellules qui ont une valeur zéro: Dans l'onglet Fichier, cliquez sur Options. Puis, dans la catégorie Avancé, regardez sous Options d'affichage pour cette feuille de calcul. Copiez les données exemple dans le tableau suivant et collez-le dans la cellule A1 d'une nouvelle feuille de calcul Excel. Pour que les formules affichent les résultats, sélectionnez-les, appuyez sur F2, puis appuyez sur Entrée. Si vous avez besoin, vous pouvez ajuster la largeur des colonnes pour voir tous les data. I ont profilé cela en utilisant le C Visual Profiler, et il représente environ 35 de la durée de fonctionnement. Cette moyenne mobile exponentielle est appelée plus d'un billion de fois, car elle est utilisée à plusieurs reprises sur le traitement de plus de 400 gigaoctets de données. Les données proviennent d'une matrice RAID niveau 0 disque solide, donc la lecture des comptes de données pour moins de 5 du temps. La taille du prix est d'environ 100. J'ai initialement accéléré par un facteur de 4 en précalculant autant de données que possible. Ensuite, je suis en mesure d'augmenter à nouveau par un facteur de ndash PaeneInsula 30 octobre 11 à 20:41 je suis en mesure d'augmenter la vitesse à nouveau par un facteur de 12 par multithreading il (la nature des données est tel qu'il peut être multithread dans d'une manière telle que la charge est parfaitement équilibré.) Et je l'ai exécuté sur un 990x i7 (qui dispose de 6 cœurs, hyperthreaded un total de 12), overclocké. Ndash PaeneInsula Oct 30 11 at 20:51 Bien sûr, multithreading peut aider. Mais vous pouvez presque assurément améliorer les performances sur une seule machine filetée. Tout d'abord, vous le calculez dans la mauvaise direction. Seules les machines les plus modernes peuvent effectuer des prélèvements de pas négatifs. Presque tous les machihnes sont plus rapides pour les foulées de l'unité. C'est à dire. Changer la direction de la baie de sorte que vous balayez de bas à haut plutôt que de haut en bas est presque toujours mieux. Ensuite, réécrire un peu - s'il vous plaît permettez-moi de raccourcir les noms des variables pour le rendre plus facile à taper: Par ailleurs, je vais commencer à utiliser des raccourcis p pour le prix et s pour le lissage, pour enregistrer la frappe. Je suis fainéant. Mais il est probablement plus rapide à faire La latence entre avgi et avgi-2 est alors 1 multiplier et un add, plutôt qu'une soustraction et une multiplication entre avgi et avgi-1. C'est à dire. Plus de deux fois plus vite. En général, vous voulez réécrire la récurrence de telle sorte que Avgi est calculée en termes de avgj pour j aussi loin que vous pouvez éventuellement aller, sans remplir la machine, soit des unités d'exécution ou de registres. Vous faites essentiellement plus de multiplications dans l'ensemble, afin d'obtenir moins de chaînes de multiples (et soustrait) sur le chemin critique. Passer de avgi-2 à avgi est facile, vous pouvez probablement faire trois et quatre. Exactement jusqu'à quel point dépend de ce que votre machine est, et combien de registres que vous avez. Et la latence de l'additionneur à virgule flottante et du multiplicateur. Ou, mieux encore, la saveur de combiner l'instruction de multiplication-ajouter que vous avez - toutes les machines modernes les ont. Par exemple. Si le MADD ou MSUB est de 7 cycles de long, vous pouvez faire jusqu'à 6 autres calculs dans son ombre, même si vous avez seulement une unité à virgule flottante. Entièrement pipeline. Etc. Moins si pipelined tous les autres cycle, comme est commun pour la double précision sur les puces plus anciennes et les GPU. Le code d'assemblage doit être un logiciel pipeline afin que les itérations de boucles différentes se chevauchent. Un bon compilateur devrait faire cela pour vous, mais vous pourriez avoir à réécrire le code C pour obtenir les meilleures performances. Soit dit en passant: je ne veux pas suggérer que vous devriez créer un tableau d'avg. Au lieu de cela, vous auriez besoin de deux moyennes si avgi est calculé en termes de avgi-2, et ainsi de suite. Vous pouvez utiliser un tableau de avgi si vous voulez, mais je pense que vous avez seulement besoin d'avoir 2 ou 4 avgs, appelé créativement, avg0 et avg1 (2, 3.), et les faire pivoter. Ce genre d'astuce, divisant un accumulateur ou moyenne en deux ou plus, combinant plusieurs étapes de la récurrence, est commun dans le code de haute performance. Oh, oui: precalculate ss, etc. Si je l'ai fait bien, en précision infinie cela serait identique. (Double vérifiez-moi, s'il vous plaît.) Toutefois, en précision finie FP vos résultats peuvent différer, j'espère que légèrement, en raison de différents arrondi. Si le déroulement est correct et que les réponses sont significativement différentes, vous avez probablement un algorithme numériquement instable. Tu es celle que tu devrais savoir. Remarque: les erreurs d'arrondissement en virgule flottante modifient les bits bas de votre réponse. Les deux à cause de réarranger le code, et en utilisant MADD. Je pense que c'est probablement correct, mais vous devez décider. Note: les calculs pour avgi et avgi-1 sont maintenant indépendants. Ainsi, vous pouvez utiliser un jeu d'instructions SIMD, comme Intel SSE2, qui permet l'opération sur deux valeurs 64 bits dans un registre de 128 bits à la fois. Thatll être bon pour presque 2X, sur une machine qui a suffisamment de ALUs. Si vous avez assez de registres pour réécrire avgi en termes de avgi-4 (et je suis sûr que vous faites sur iA64), alors vous pouvez aller 4X de large, si vous avez accès à une machine comme 256 bit AVX. Sur un GPU. Vous pouvez aller pour les récidives plus profondes, réécriture avgi en termes de avgi-8, et ainsi de suite. Certains GPU ont des instructions qui calculent AXB ou même AXBY comme une seule instruction. Bien que thats plus commun pour 32 bits que pour 64 bits de précision. À un certain point, je commencerais probablement à demander: voulez-vous faire cela sur plusieurs prix à la fois Non seulement cela vous aider avec multithreading, il sera également le faire fonctionner sur un GPU. Et en utilisant SIMD large. Minor Late Addition Je suis un peu embarrassé de ne pas avoir appliqué Horners Rule à des expressions comme un peu plus efficace. Résultats légèrement différents avec arrondissement. Dans ma défense, tout compilateur décent devrait le faire pour vous. Mais la règle Hrners rend la chaîne de dépendance plus profonde en termes de multiplication. Vous pourriez avoir besoin de dérouler et pipeline la boucle quelques fois de plus. Ou vous pouvez faire où vous precalculate


No comments:

Post a Comment