2024-04-11 23:04:30 +02:00
|
|
|
// Copyright (C) NHR@FAU, University Erlangen-Nuremberg.
|
2023-05-15 14:32:23 +02:00
|
|
|
// All rights reserved.
|
|
|
|
// Use of this source code is governed by a MIT-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package util
|
|
|
|
|
2024-07-04 14:14:27 +02:00
|
|
|
import (
|
|
|
|
"golang.org/x/exp/constraints"
|
2024-07-09 09:28:21 +02:00
|
|
|
|
2024-05-08 16:17:42 +02:00
|
|
|
"fmt"
|
|
|
|
"math"
|
|
|
|
"sort"
|
2024-07-04 14:14:27 +02:00
|
|
|
)
|
2023-05-15 14:32:23 +02:00
|
|
|
|
|
|
|
func Min[T constraints.Ordered](a, b T) T {
|
|
|
|
if a < b {
|
|
|
|
return a
|
|
|
|
}
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
func Max[T constraints.Ordered](a, b T) T {
|
|
|
|
if a > b {
|
|
|
|
return a
|
|
|
|
}
|
|
|
|
return b
|
|
|
|
}
|
2024-07-04 14:14:27 +02:00
|
|
|
|
2024-05-08 16:17:42 +02:00
|
|
|
func sortedCopy(input []float64) []float64 {
|
|
|
|
sorted := make([]float64, len(input))
|
|
|
|
copy(sorted, input)
|
|
|
|
sort.Float64s(sorted)
|
|
|
|
return sorted
|
|
|
|
}
|
|
|
|
|
|
|
|
func Mean(input []float64) (float64, error) {
|
|
|
|
if len(input) == 0 {
|
|
|
|
return math.NaN(), fmt.Errorf("input array is empty: %#v", input)
|
|
|
|
}
|
|
|
|
sum := 0.0
|
|
|
|
for _, n := range input {
|
|
|
|
sum += n
|
|
|
|
}
|
|
|
|
return sum / float64(len(input)), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func Median(input []float64) (median float64, err error) {
|
|
|
|
c := sortedCopy(input)
|
|
|
|
// Even numbers: add the two middle numbers, divide by two (use mean function)
|
|
|
|
// Odd numbers: Use the middle number
|
|
|
|
l := len(c)
|
|
|
|
if l == 0 {
|
|
|
|
return math.NaN(), fmt.Errorf("input array is empty: %#v", input)
|
|
|
|
} else if l%2 == 0 {
|
|
|
|
median, _ = Mean(c[l/2-1 : l/2+1])
|
|
|
|
} else {
|
|
|
|
median = c[l/2]
|
|
|
|
}
|
|
|
|
return median, nil
|
|
|
|
}
|