-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathavg.go
70 lines (55 loc) · 1.14 KB
/
avg.go
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package main
import "sync"
func average(matBuf1 *MatBuffer, n float32, mins *[13362]float32, maxs *[13362]float32, order <-chan int, wg *sync.WaitGroup) {
for {
index, ok := <-order
if ok {
myMin := matBuf1[index][0] / n
myMax := matBuf1[index][0] / n
for i := range matBuf1[index] {
avgedValue := matBuf1[index][i] / n
matBuf1[index][i] = avgedValue
if myMin > avgedValue {
myMin = avgedValue
} else if myMax < avgedValue {
myMax = avgedValue
}
}
mins[index] = myMin
maxs[index] = myMax
wg.Done()
} else {
break
}
}
return
}
// return min, and max value
func doAverage(matBuf1 *MatBuffer, n float32) (float32, float32) {
order := make(chan int, numWorkers)
var wg sync.WaitGroup
var mins [13362]float32
var maxs [13362]float32
for i := 0; i < numWorkers; i++ {
go average(matBuf1, n, &mins, &maxs, order, &wg)
}
wg.Add(13362)
for i := 0; i < 13362; i++ {
order <- i
}
wg.Wait()
close(order)
var min float32
var max float32
for _, val := range mins {
if min > val {
min = val
}
}
for _, val := range maxs {
if max < val {
max = val
}
}
return min, max
}