Si la performance de ce code est critique, alors il pourrait être logique d'éviter les allocations de tas pour Candle s. Je pense que la façon la plus raisonnable de faire cela serait de faire Candle dans une structure. Bien que les types de valeurs mutables soient mauvais. Donc je refondrais aussi Candle pour être immuable. Cela signifie également que la mise en œuvre de newestCandle devrait changer, probablement dans une paire de champs doubles (ou, alternativement, une classe mutable et réinitialisable séparée). Je ne vois aucun autre problème potentiel de performance dans votre code. Mais quand il s'agit de performance, vous devriez toujours compter sur le profilage, et non pas votre intuition (ou quelqu'un d'autre). Aussi, je n'aime pas certains noms de vos méthodes. Plus précisément: ValueUpdated. Les noms de méthode doivent généralement être sous la forme faire quelque chose, pas quelque chose s'est passé. Je pense donc qu'un meilleur nom serait UpdateValue. Ajouter. Modifier. Ce sont les deux opérations fondamentales de votre MovingAverage et je pense que ces noms n'expriment pas bien le sens. Je les appellerais quelque chose comme MoveAndSetCurrent et SetCurrent. respectivement. Bien que cette nomination indique que les opérations fondamentales devraient plutôt être Move et SetCurrent. J'ai essentiellement un tableau de valeurs comme ceci: Le tableau ci-dessus est simplifié, Im collecte 1 valeur par millisecond dans mon code réel et je dois traiter la sortie sur un Algorithme que j'ai écrit pour trouver le pic le plus proche avant un point dans le temps. Ma logique échoue parce que dans mon exemple ci-dessus, 0.36 est le vrai pic, mais mon algorithme regarderait en arrière et verrait le tout dernier chiffre 0.25 comme le pic, car il y a une diminution à 0.24 avant lui. L'objectif est de prendre ces valeurs et de leur appliquer un algorithme qui les lisse un peu pour que je possède des valeurs plus linéaires. (C.-à-d.: Id comme mes résultats à curvy, pas jaggedy) On m'a dit d'appliquer un filtre exponentiel de moyenne mobile à mes valeurs. Comment puis-je le faire C'est vraiment difficile pour moi de lire les équations mathématiques, je traite beaucoup mieux avec le code. Comment puis-je traiter les valeurs dans mon tableau, en appliquant un calcul de moyenne exponentielle de la mobilité pour les égaliser demandée Feb 8 12 at 20:27 Pour calculer une moyenne mobile exponentielle. Vous devez garder un certain état autour et vous avez besoin d'un paramètre de réglage. Cela nécessite une petite classe (en supposant que vous utilisiez Java 5 ou plus tard): Instantiate avec le paramètre de décroissance que vous voulez (peut prendre l'accord doit être entre 0 et 1), puis utilisez la moyenne () pour filtrer. Lors de la lecture d'une page sur une récurrence mathématique, tout ce que vous avez vraiment besoin de savoir lorsque vous le transformer en code est que les mathématiciens aiment écrire des index dans des tableaux et des séquences avec des indices. (Theyve quelques autres notations ainsi, ce qui ne l'aide pas.) Cependant, l'EMA est assez simple car vous devez seulement se souvenir d'une vieille valeur aucune arrays compliqués d'état requis. Répondre févr. 8 12 at 20h42 TKKocheran: Pretty much. Notez que les premiers termes de la séquence moyenne sauteront un peu en raison des effets de frontière, mais vous obtenez ceux avec d'autres moyennes mobiles aussi. Cependant, un bon avantage est que vous pouvez envelopper la logique de la moyenne mobile dans le moyager et expérimenter sans déranger le reste de votre programme trop. Ndash Donal Fellows Feb 9 12 at 0:06 J'ai de la difficulté à comprendre vos questions, mais je vais essayer de répondre de toute façon. 1) Si votre algorithme a trouvé 0,25 au lieu de 0,36, alors il est faux. C'est faux parce qu'il suppose une augmentation ou une diminution monotone (qui monte ou monte toujours). Sauf si vous moyenne toutes vos données, vos points de données --- comme vous les présenter --- sont non linéaires. Si vous voulez vraiment trouver la valeur maximale entre deux points dans le temps, découpez votre tableau de tmin à tmax et trouvez le maximum de ce sous-tableau. 2) Maintenant, le concept de moyennes mobiles est très simple: imaginez que j'ai la liste suivante: 1.4, 1.5, 1.4, 1.5, 1.5. Je peux le lisser en prenant la moyenne de deux nombres: 1.45, 1.45, 1.45, 1.5. Notez que le premier nombre est la moyenne de 1,5 et 1,4 (deuxième et premier numéros) la deuxième (nouvelle liste) est la moyenne de 1,4 et 1,5 (troisième et deuxième liste ancienne) la troisième (nouvelle liste) la moyenne de 1,5 et 1,4 (Quatrième et troisième), et ainsi de suite. J'aurais pu faire la période trois ou quatre, ou n. Remarquez comment les données sont beaucoup plus lisses. Une bonne façon de voir les moyennes mobiles au travail est d'aller à Google Finance, sélectionnez un stock (essayez Tesla Motors assez volatile (TSLA)) et cliquez sur technicals au bas du graphique. Sélectionnez Moyenne mobile avec une période donnée, et Moyenne mobile exponentielle pour comparer leurs différences. Moyenne mobile exponentielle est juste une autre élaboration de cela, mais pondère les données plus anciennes moins que les nouvelles données, c'est une façon de biais le lissage vers l'arrière. Veuillez lire l'entrée de Wikipedia. Donc, c'est plus un commentaire qu'une réponse, mais la petite boîte de commentaire était juste à minuscule. Bonne chance. Si vous avez des problèmes avec les mathématiques, vous pourriez aller avec une moyenne mobile simple au lieu d'exponentielle. Donc, la sortie que vous obtenez serait les derniers termes x divisé par x. Pseudocode non testé: Notez que vous devrez manipuler les parties de début et de fin des données car clairement vous ne pouvez pas moyenne les 5 derniers termes lorsque vous êtes sur votre 2e point de données. En outre, il existe des moyens plus efficaces de calculer cette moyenne mobile (somme somme - la plus récente la plus récente), mais c'est pour obtenir le concept de ce qui se passe à travers. Réponse 2016 Stack Exchange, Inc
No comments:
Post a Comment