File size: 953 Bytes
ca7217f | 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 | package position
var (
_ = AverageVector
_ = WeightedAverageVector
)
func AverageVector(vectors []Vector) Vector {
return WeightedAverageBy(vectors,
func(v Vector) WeightedVector {
return WeightedVector{v, 1.0}
},
)
}
func WeightedAverageVector(vectors []WeightedVector) Vector {
return WeightedAverageBy(vectors,
func(v WeightedVector) WeightedVector {
return v
},
)
}
func WeightedAverageBy[T any](items []T, get func(T) WeightedVector) Vector {
if len(items) == 0 {
return Vector{}
}
dim := get(items[0]).Dim()
sum := make([]Position, dim)
var totalWeight float64
for _, item := range items {
wv := get(item)
if wv.Dim() != dim {
panic("dimension mismatch")
}
for i := 0; i < dim; i++ {
sum[i] += wv.At(i) * Position(wv.Weight())
}
totalWeight += wv.Weight()
}
if totalWeight <= 0 {
return Vector{}
}
for i := 0; i < dim; i++ {
sum[i] /= Position(totalWeight)
}
return Vector{sum}
}
|