gitee.com/quant1x/num@v0.3.2/minimum.go (about)

     1  package num
     2  
     3  import (
     4  	"gitee.com/quant1x/num/x32"
     5  	"gitee.com/quant1x/num/x64"
     6  	"slices"
     7  )
     8  
     9  // Minimum AVX2版本, 两个序列横向比较最大值
    10  func Minimum[T Number](f1, f2 []T) []T {
    11  	xlen := len(f1)
    12  	ylen := len(f2)
    13  
    14  	// 第找出最大长度
    15  	maxLength := xlen
    16  	if maxLength < ylen {
    17  		maxLength = ylen
    18  	}
    19  
    20  	// 处理默认值
    21  	defaultValue := TypeDefault[T]()
    22  	// 对齐所有长度
    23  	if xlen < maxLength {
    24  		f1 = Align(f1, T(defaultValue), maxLength)
    25  	}
    26  	if ylen < maxLength {
    27  		f2 = Align(f2, T(defaultValue), maxLength)
    28  	}
    29  	// 初始化返回值
    30  	var s1, s2 any
    31  	s1 = f1
    32  	s2 = f2
    33  
    34  	var d any
    35  	switch fs1 := s1.(type) {
    36  	case []float32:
    37  		d = x32.Minimum(fs1, s2.([]float32))
    38  	case []float64:
    39  		d = x64.Minimum(fs1, s2.([]float64))
    40  	default:
    41  		// 目前暂时走不到这里
    42  		f1 = slices.Clone(f1)
    43  		__go_minimum(f1, f2)
    44  		d = f1
    45  	}
    46  	return d.([]T)
    47  }
    48  
    49  func __go_minimum[T Number](x, y []T) {
    50  	for i := 0; i < len(x); i++ {
    51  		if y[i] < x[i] {
    52  			x[i] = y[i]
    53  		}
    54  	}
    55  }