github.com/qiaogw/arrgo@v0.0.8/utils.go (about) 1 package arrgo 2 3 import ( 4 "math" 5 "sort" 6 ) 7 8 func ReverseIntSlice(slice []int) []int { 9 s := make([]int, len(slice)) 10 copy(s, slice) 11 for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { 12 s[i], s[j] = s[j], s[i] 13 } 14 return s 15 } 16 17 //计算[]int的所有元素的乘积. 18 func ProductIntSlice(slice []int) int { 19 var prod = 1 20 for _, v := range slice { 21 prod *= v 22 } 23 return prod 24 } 25 26 func Roundf(val float64, places int) float64 { 27 var t float64 28 f := math.Pow10(places) 29 x := val * f 30 if math.IsInf(x, 0) || math.IsNaN(x) { 31 return val 32 } 33 if x >= 0.0 { 34 t = math.Ceil(x) 35 if (t - x) > 0.50000000001 { 36 t -= 1.0 37 } 38 } else { 39 t = math.Ceil(-x) 40 if (t + x) > 0.50000000001 { 41 t -= 1.0 42 } 43 t = -t 44 } 45 x = t / f 46 47 if !math.IsInf(x, 0) { 48 return x 49 } 50 51 return t 52 } 53 54 func Hmin(ln int, Data []float64) { 55 for i := 0; i*ln < len(Data); i++ { 56 minValue := Data[i*ln] 57 for j := i*ln + 1; j < i*ln+ln; j++ { 58 if minValue > Data[j] { 59 minValue = Data[j] 60 } 61 } 62 Data[i] = minValue 63 } 64 } 65 66 func Vmin(a, b []float64) { 67 for i := range a { 68 if a[i] > b[i] { 69 a[i] = b[i] 70 } 71 } 72 } 73 74 func Hmax(ln int, Data []float64) { 75 for i := 0; i*ln < len(Data); i++ { 76 maxValue := Data[i*ln] 77 for j := i*ln + 1; j < i*ln+ln; j++ { 78 if maxValue < Data[j] { 79 maxValue = Data[j] 80 } 81 } 82 Data[i] = maxValue 83 } 84 } 85 86 func Vmax(a, b []float64) { 87 for i := range a { 88 if a[i] < b[i] { 89 a[i] = b[i] 90 } 91 } 92 } 93 94 //在data中计算每ln个数据中,最大值的位置,并将结果依次放到data中。 95 func Hargmax(ln int, Data []float64) { 96 for i := 0; i*ln < len(Data); i += 1 { 97 maxValue := Data[i*ln] 98 maxIndex := 0.0 99 for j := i*ln + 1; j < i*ln+ln; j++ { 100 if maxValue < Data[j] { 101 maxValue = Data[j] 102 maxIndex = float64(j % ln) 103 } 104 } 105 Data[i] = maxIndex 106 } 107 } 108 109 func Vargmax(ln int, a []float64) { 110 for i := 0; i < ln; i++ { 111 maxValue := a[i] 112 maxIndex := 0.0 113 for j := i + ln; j < len(a); j += ln { 114 if maxValue < a[j] { 115 maxValue = a[j] 116 maxIndex = float64(int(j / ln)) 117 } 118 } 119 a[i] = maxIndex 120 } 121 } 122 123 func Hargmin(ln int, Data []float64) { 124 for i := 0; i*ln < len(Data); i++ { 125 minValue := Data[i*ln] 126 minIndex := 0.0 127 for j := i*ln + 1; j < i*ln+ln; j++ { 128 if minValue > Data[j] { 129 minValue = Data[j] 130 minIndex = float64(j % ln) 131 } 132 } 133 Data[i] = minIndex 134 } 135 } 136 137 func Vargmin(ln int, a []float64) { 138 for i := 0; i < ln; i++ { 139 minValue := a[i] 140 minIndex := 0.0 141 for j := i + ln; j < len(a); j += ln { 142 if minValue > a[j] { 143 minValue = a[j] 144 minIndex = float64(int(j / ln)) 145 } 146 } 147 a[i] = minIndex 148 } 149 } 150 151 func Hsort(ln int, Data []float64) { 152 for i := 0; i*ln < len(Data); i++ { 153 sort.Float64s(Data[i*ln : i*ln+ln]) 154 } 155 } 156 157 func Vsort(ln int, a []float64) { 158 for i := 0; i < ln; i++ { 159 tmpSlice := make([]float64, 0, len(a)/ln) 160 for j := i; j < len(a); j += ln { 161 tmpSlice = append(tmpSlice, a[j]) 162 } 163 sort.Float64s(tmpSlice) 164 for j := i; j < len(a); j += ln { 165 a[j] = tmpSlice[j/ln] 166 } 167 } 168 } 169 170 func ContainsFloat64(s []float64, e float64) bool { 171 for _, v := range s { 172 if v == e { 173 return true 174 } 175 } 176 return false 177 } 178 179 func ContainsInt(s []int, e int) bool { 180 for _, v := range s { 181 if v == e { 182 return true 183 } 184 } 185 return false 186 } 187 188 //判断两个[]int是否相等。 189 //相等是严格的相等,否则为不等。 190 //如果有一个为nil则为不相等。 191 func SameIntSlice(a, b []int) bool { 192 if a == nil || b == nil { 193 return false 194 } 195 if len(a) != len(b) { 196 return false 197 } else { 198 for i := range a { 199 if a[i] != b[i] { 200 return false 201 } 202 } 203 return true 204 } 205 } 206 207 //判断两个[]float64是否相等。 208 //相等是严格的相等,否则为不等。 209 //如果有一个为nil则为不相等。 210 func SameFloat64Slice(a, b []float64) bool { 211 if a == nil || b == nil { 212 return false 213 } 214 if len(a) != len(b) { 215 return false 216 } else { 217 for i := range a { 218 if a[i] != b[i] { 219 return false 220 } 221 } 222 return true 223 } 224 } 225 226 //判断两个[]bool是否相等。 227 //相等是严格的相等,否则为不等。 228 //如果有一个为nil则为不相等。 229 func SameBoolSlice(a, b []bool) bool { 230 if a == nil || b == nil { 231 return false 232 } 233 if len(a) != len(b) { 234 return false 235 } else { 236 for i := range a { 237 if a[i] != b[i] { 238 return false 239 } 240 } 241 return true 242 } 243 }