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