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
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022
- 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
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022
613
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
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022
613
26 juin 2016 à 21:03
VB.Net donc.
Je fais déplacer dans le bon forum
0
Whismeril
Messages postés
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022
613
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
2917
Date d'inscription
samedi 11 janvier 2014
Statut
Non membre
Dernière intervention
16 août 2022
154
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
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022
613
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
2917
Date d'inscription
samedi 11 janvier 2014
Statut
Non membre
Dernière intervention
16 août 2022
154 > Whismeril
Messages postés
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022

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
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022
613 > vb95
Messages postés
2917
Date d'inscription
samedi 11 janvier 2014
Statut
Non membre
Dernière intervention
16 août 2022

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
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022
613
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
2917
Date d'inscription
samedi 11 janvier 2014
Statut
Non membre
Dernière intervention
16 août 2022
154 > Whismeril
Messages postés
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022

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
235
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
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022
613
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
235 > Whismeril
Messages postés
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022

27 juin 2016 à 07:47
Bonjour, Whismeril. Fait.
0
Whismeril
Messages postés
17673
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
15 août 2022
613 > 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