Toon posts:

[VB6] Lijstje met gegevens maken en wijzigen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb in VB6 een recordset van zo'n 1500 records. Nu wil ik de 'running average' berekenen van 4 records per keer.
Dit betekent dat ik eerst record 1 t/m 4 bij elkaar optel en middel, dan 2 t/m 5, 3 t/m 6, enz.
Ikzelf had bedacht om het blokje van 4 in een array te stoppen, steeds de eerste te verwijderen en een nieuw record aan het einde toe te voegen.

Alleen als ik dat doe, wordt mijn index van mijn array steeds groter. Dus is het gebruiken van een array niet de juiste oplossing.
Is er binnen VB6 een ander object dat dit wel aankan.

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Je kunt een hulpindex gebruiken j=i mod 4. Je trekt dan van het totaal
de waarde in array(j) af en bewaart de nieuwe waarde ook weer in in array(j).

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Topicstarter
@Niesje:
Ik snap je oplossing nog niet helemaal.

Ik heb een multi-dimensionale array van 4 (dit wordt door de gebruiker opgegeven, kan ook 3, 5 of 6 zijn) bij ca. 200 (het aantal velden in mijn recordset).

Ik heb al een stukje code voor recor 1 tm 4:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Public Sub berekenRunningAverage(grd As MSFlexGrid, _
rst As ADODB.Recordset, _
iWindowSize As Integer)
'Bereken aan de hand van de windowsize de running average
'Running average middelt een aantal (windowsize) records,
'de eerste gaat van 1 tot windowsize, de tweede van 2 tot windowsize+1, enz.
'Er is een array nodig met grootte = windowsize, van de inhoud van deze array wordt
'het gemiddelde berekent en dit gemiddelde wordt in het grid getoont.
'Vervolgens wordt de eerste verwijderd en de volgende toegevoegd.
Dim runningAverage() As Double
Dim i As Integer, j As Integer
Dim gemiddelde As Double
Dim row As Integer

  'init:
  ReDim runningAverage(iWindowSize, rst.Fields.Count)
  'Eerste keer vullen:
  rst.MoveFirst
  For j = 0 To iWindowSize - 1
    For i = 0 To rst.Fields.Count - 1
      If rst.Fields(i).Name <> "spectrum" Then
        runningAverage(j, i) = rst.Fields(i).Value
      End If
    Next i
    rst.MoveNext
  Next j
  
'TODO
'Dit voor alle records:
'Maar hoe?

  'Allen optellen:
  For i = 0 To rst.Fields.Count - 1
      For j = 0 To iWindowSize
        gemiddelde = gemiddelde + runningAverage(j, i)
      Next j
      gemiddelde = gemiddelde / iWindowSize  
  Next i
  
  'Klaar
End Sub

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Ik snap niet goed wat je nu doet in de for..next na 'allen optellen'. Omdat je steeds na ieder veld het gemiddelde deelt zijn alleen de laatste paar velden relevant voor het eindresultaat. Wil je één gemiddelde over alle velden, of voor ieder veld een gemiddelde (over iWindowSize records)?

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Topicstarter
Wat ik wil is het gemiddelde van elk veld over iWindowSize records.
Het stukje code wat ik in mijn eerdere post heb gezet werkt voor het eerste blokje records. Ik krijg in dit voorbeeld van record 1 tm 4 een nieuw record met de gemiddelde van elk veld. Dat is precies wat ik wil. Maar nu wil ik de volgende blokjes gaan uitrekenen.
Daarvoor moet ik bij "TODO" uit mijn runningAverage-array de eerste verwijderen en een nieuw record toe voegen, zodat ik het gemiddelde van record 2 tm 5 kan gaan berekenen.
Maar als ik dat doe moet ik steeds mijn loop
code:
1
2
3
      For j = 0 To iWindowSize
        gemiddelde = gemiddelde + runningAverage(j, i)
      Next j

aanpassen omdat j steeds 1 hoger wordt en dus mijn array ook.

Ik bedenk me net dat ik het dan ook wel zonder array kan doen dan loop ik door mijn recordset heen en bereken dan mijn gemiddelden en bewaar die in een nieuwe recordset.

Ik ga dat wel even proberen. Waarschijnlijk heb ik het me zelf moeilijker gemaakt dan het is ;)