ok hier het probleem...
ik heb een array met daarin een data-array die ik dmv uitmiddeling wil verkleinen. de onderstaande code doet dat perfect.
vb matrix:
[ tijdstip(0) ] [ tijdstip(1) ] [enz..] (tijdstip = unixtime)
[waarde1(0)] [waarde1(1)] [enz..] (waardes zijn bijv percentages)
[waarde2(0)] [waarde2(1)] [enz..]
echter nu het probleem... als er geen data op een bepaald tijdstip opgenomen wordt komt er een -1 te staan... deze waarde geeft natuurlijk problemen bij het middelen en zal verwijderd moeten worden. maar in de array hoeven niet alle waarden op dat tijdstip -1 te zijn...
uiteindelijk zal het gemiddelde dus berekent moeten worden met
$this->arrAvg[$i] = ($this->arrSum[$i] / ( $this->iCnt[$i]) ); zodat alle sums door de juiste aantal waardes gedeeld worden (als er dus -1 waardes geskipped worden)
iemand een snelle oplossing hiervoor (zonder het per row te berekenen en daarna bij elkaar te voegen)
ik heb een array met daarin een data-array die ik dmv uitmiddeling wil verkleinen. de onderstaande code doet dat perfect.
vb matrix:
[ tijdstip(0) ] [ tijdstip(1) ] [enz..] (tijdstip = unixtime)
[waarde1(0)] [waarde1(1)] [enz..] (waardes zijn bijv percentages)
[waarde2(0)] [waarde2(1)] [enz..]
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
| function StoreAverage(&$row, $interval = 300) { if($this->iAverageEnd == 0) { // iaverageEnd is altijd 0 aan het begin $this->iAverageEnd = $row[0] + ($this->iAverageDelta) * $interval; // berekening van iAverageEnd (tijdstip 0 + iAverageDelta * 300secs... //bij delta van 12 is de middeling dus over een uur $this->iCnt++; for($i = 1; $i <= $this->iColumnCount; $i++) { $this->arrSum[$i] = $row[$i]; // de waarden op tijdstip 0 in arrSum zetten + iCnt op 1 zetten. } } else { if($row[0] < $this->iAverageEnd) { $this->iCnt++; for($i = 1; $i <= $this->iColumnCount; $i++) { $this->arrSum[$i] += $row[$i]; // zolang het eindtijdstip niet bereikt is de opvolgende waardes bij arrSum optellen } } else { if($row[0] == $this->iAverageEnd) { $this->arrData = array("", $row[0]); $this->iCnt++; for($i = 1; $i <= $this->iColumnCount; $i++) { $this->arrSum[$i] += $row[$i]; $this->arrAvg[$i] = ($this->arrSum[$i] / ( $this->iCnt) ); array_push($this->arrData, $this->arrAvg[$i]); // als het eindtijdstip(iAverageEnd) precies gelijk is aan het tijdstip($row[0]) // dan nog optellen bij arrSum en het gemiddelde berekenen // door te delen door het aantal punten (iCnt) } $this->iAverageEnd = 0; $this->iCnt = 0; array_push($this->arrImgData, $this->arrData); } else { for($i = 1; $i <= $this->iColumnCount; $i++) { $this->arrAvg[$i] = ($this->arrSum[$i] / ( $this->iCnt) ); array_push($this->arrData, $this->arrAvg[$i]); // Als het tijdstip groter is dan iAverageEnd dan direct het gemiddelde berekenen // en het volgende punt dat gemiddeld gaat worden } $this->iAverageEnd = 0; $this->iCnt = 0; array_push($this->arrImgData, $this->arrData); $this->iAverageEnd = $row[0] + ($this->iAverageDelta) * $interval; $this->iCnt++; for($i = 1; $i <= $this->iColumnCount; $i++) { $this->arrSum[$i] = $row[$i]; } } } } } |
echter nu het probleem... als er geen data op een bepaald tijdstip opgenomen wordt komt er een -1 te staan... deze waarde geeft natuurlijk problemen bij het middelen en zal verwijderd moeten worden. maar in de array hoeven niet alle waarden op dat tijdstip -1 te zijn...
uiteindelijk zal het gemiddelde dus berekent moeten worden met
$this->arrAvg[$i] = ($this->arrSum[$i] / ( $this->iCnt[$i]) ); zodat alle sums door de juiste aantal waardes gedeeld worden (als er dus -1 waardes geskipped worden)
iemand een snelle oplossing hiervoor (zonder het per row te berekenen en daarna bij elkaar te voegen)