Calcul moyenne glissée à partir d'un tableau de données

Fran974 Messages postés 2 Date d'inscription dimanche 26 juin 2016 Statut Membre Dernière intervention 26 juin 2016 - Modifié par ucfoutu le 27/06/2016 à 07:47
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 - 28 juin 2016 à 10:07
Bonjour,
Je suis un grand novice en programmation et VB et je cherche de l'aide !
Je dispose d'un _tableau(6000, 2) As Decimal et je voudrais calculer la moyenne glissée (toutes les 10 valeurs) et en retenir le quotient (moyenne des données de la première variable / moyenne des données de la deuxième variable) le plus grand.
Actuellement mon code ne donne que la première moyenne, la répétition de la boucle ne semble pas marcher ! Des conseils s'il vous plait ? :)

 Dim i As Integer = 0
Dim moy_1 As Decimal = 0 ' moyenne de la première variable du tableau précédemment définie
Dim moy_2 As Decimal = 0 ' moyenne de la deuxième variable du tableau
Dim valeur As Decimal = 0
Dim valeur_max As Decimal = 0

For i = 0 To 6000 Step 10
moy_1 = moy_1 + _tableau(i, 1)
moy_2 = moy_2 + _tableau(i, 2)
valeur = (moy_1 / 10) / (moy_2/ 10)
If valeur < valeur_max Then
valeur_max = valeur
End If
Continue For
Next


Code mis entre balises (veux-tu bien y penser dorénavant ?).

6 réponses

Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
26 juin 2016 à 20:18
Bonjour

quel VB?
  • VBA?
  • VBS?
  • VB6?
  • VB.Net?

0
Fran974 Messages postés 2 Date d'inscription dimanche 26 juin 2016 Statut Membre Dernière intervention 26 juin 2016
26 juin 2016 à 20:39
VB Express
Et pardon , c'est If valeur > valeur_max Then
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
26 juin 2016 à 21:03
VB.Net donc.
Je fais déplacer dans le bon forum
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
Modifié par Whismeril le 26/06/2016 à 21:09
Ce que je comprends de ton texte n'est pas cohérent avec ton code.

Ai je bien compris:
tu veux faire la moyenne des 10 premiers enregistrements (0 à 9), sur tes 2 dimensions, diviser les résultats puis stocker quotient quelque part, ensuite faire de même avec les enregistrement de 10 à 19, etc...
Et à la fin retourner le plus grand quotient c'est bien ça?

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
27 juin 2016 à 01:34
Bonsoir
J'ai compris la même chose que Whismeril
De plus en VB Net les tableaux commencent à l'indice 0
donc le boucle serait plutôt
For i = 0 to 5999 step 10


Le code donnerait à mon avis si j'ai bien compris

Dim valeur As Decimal
Dim valeurmax As Decimal = 0
Dim moy1 As Decimal
Dim moy2 As Decimal
Dim index as Integer
For i = 0 To 599 ' 600 boucles
valeur = 0
moy1 = 0
moy2 = 0
Index = i * 10
For j = 0 To 9 ' à faire 10 fois
moy1 = moy1 + tableau(index + j, 1)
moy2 = moy2 + tableau(index + j, 2)
Next j
valeur = (moy1 / 10) / (moy2 / 10)
If valeur > valeur_max Then valeur_max = valeur
Next i


remarque
 valeur = (moy1 / 10) / (moy2 / 10)

peut se simplifier par
 valeur = moy1  / moy2 


(100/10)/(50/10) est équivalent à 100/50
10 / 5 est égal à 100 / 50
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
27 juin 2016 à 07:01
Salut Vb, on peut faire plus simple encore.

Même si le tableau existe surtout par compatibilité avec des langages plus bas niveau (import d'une dll en c), il bénéficie de certaines avancées de la framework, entre autre les extensions de Linq.

Ainsi Take(n) permet de prendre n éléments consécutifs dans une collection pour en faire une autre collection, Skip(n) permet de passer n éléments d'une collection pour en retourner une autre.
En cumulant ces deux méthodes, on peut donc facilement prendre les paquets de 10 de façon successive.
Une fois qu'on a notre paquet de 10, il y a la méthode Average, qui peut importe le nombre d'éléments en calcule la moyenne.

Je suis sur ma tablette mais donc je ne peux pas essayer et donc montrer un code fonctionnel, c'est la gestion de la 2eme dimension du tableau dont je ne suis pas sûr.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024
27 juin 2016 à 07:58
Salut Whis
plus simple en code d'accord mais d'un niveau supérieur en programmation
Pour moi la seconde dimension est l'indice des valeurs 1 et 2 associées aux moyennes 1 et 2 dont notre ami parle
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
27 juin 2016 à 08:16
Oui, c'est ça.
Mon "soucis" est que sans vs pour tester, je ne sais plus bien comment réagissent Skip, Take et Average sur deux dimensions.
Ça se gère, mais il faut juste que j'essaie.

De plus comme tu l'as montré le Average ne sert à rien.
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
27 juin 2016 à 11:35
J'ai pu tester, Linq ne marche pas dans un tableau multi-dimensions, il faut linéariser d'abord.
Du coup ça complique un peu.

C'est là ou utiliser VB.Net pour ce qu'il est (à savoir un langage Objet), est rentable.

Au lieu d'un tableau à 2 dimensions, une collection (même un tableau) d'une classe de 2 propriétés (numérateur et dénominateur), voire une troisième en lecture seule retournant le quotient), d'une part c'est plus lisible et donc plus facile à maintenir:

quotient = tableau(x,0)/tableau(x,1)

'un peu plus lisible
quotient = maCollection(x).Numerateur /  MaCollection(x).DeNominateur

'encore plus lisible
quotient = maCollection(x).Quotient


Et du coup, Skip, Take, Average et Max (que j'avais oublié ce matin) sont directement utilisables.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024
Modifié par vb95 le 27/06/2016 à 14:54
Si j'ai bien compris une collection d'objets Indice de 0 à 5999 avec les propriétés Numerateur, Denominateur et Quotient
On peut aussi passer par les structures pour les Indicesi
Va falloir que je m'y mette à la Programmation Objet un de ces quatre !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 juin 2016 à 07:35
Bonjour à tous,
J'aimerais connaître la signification précise que donne Fran974 aus termes "moyenne glissée".
S'agit-il :
1) - d'une moyenne glissante, donc mobile
ou
2) - d'une moyenne "lissée"

Si réponse 2 : indiquer de manière précise (en langage naturel) la manière décidée pour "lisser"
Si réponse 1 : le code que je vois, tant en ce qui concerne moy_1 que moy_2, n'est pas celui du calcul d'une moyenne glissante !
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
Modifié par Whismeril le 27/06/2016 à 07:40
Bonjour Uc, tout à fait.

Ps, pourrais tu colorer le code de la question? Merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024
27 juin 2016 à 07:47
Bonjour, Whismeril. Fait.
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656 > ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018
27 juin 2016 à 08:17
Merci
0
Rejoignez-nous