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 ?).
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
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
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.
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
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.
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.
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 !
Donc mieux vaut une classe qu'une structure ainsi qu'une collection plutôt qu'un tableau
Plus facile pour moi à visualiser le mécanisme dans ma tête qu'à me servir de ce même mécanisme dans le code surtout au niveau classe et structure
Pour les collections je commence à pas trop mal les maitriser
Merci pour toutes ces infos Whis
Public Class Division
Public Sub New(ByVal LeNumerateur As Double, ByVal LeDenominateur As Double) 'constructeur avec les deux nombres à diviser
Numerateur = LeNumerateur
Denominateur = LeDenominateur
End Sub
Public Property Numerateur() As Double
Public Property Denominateur() As Double
Public ReadOnly Property Quotient() As Double 'propriété en lecture seule qui retourne le quotient
Get
Return Numerateur / Denominateur
End Get
End Property
End Class
Et le traitement, la première partie sert à initialiser des données et la 2eme à faire "la moyenne glissée"
'======Initilialisation
Dim mesDivisions(49) As Division
Dim rnd As New Random()
For i As Integer = 0 To 49
mesDivisions(i) = New Division(rnd.NextDouble(), rnd.NextDouble())
Next i
'======="moyenne glissée" selon Fran974
Dim lesQuotients As New List(Of Double)()
For i As Integer = 0 To 49 Step 10
lesQuotients.Add(mesDivisions.Skip(i).Take(10).Average(Function(x) x.Quotient))
Next i
Dim MoyenneMaxi As Double = lesQuotients.Max()
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 !