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  }