diff --git a/stat/abs.go b/stat/abs.go new file mode 100644 index 0000000000000000000000000000000000000000..c3af367fe0e751589bfa0629dee32367255096aa --- /dev/null +++ b/stat/abs.go @@ -0,0 +1,14 @@ +package stat + +func Abs[T StatType](x []T) []T { + xlen := len(x) + d := make([]T, xlen) + for i := 0; i < xlen; i++ { + if x[i] < 0 { + d[i] = -1 * (x[i]) + } else { + d[i] = x[i] + } + } + return d +} diff --git a/stat/abs_test.go b/stat/abs_test.go new file mode 100644 index 0000000000000000000000000000000000000000..45f76f96d70b61a87810052c3dab04593906edaf --- /dev/null +++ b/stat/abs_test.go @@ -0,0 +1,19 @@ +package stat + +import ( + "fmt" + "testing" +) + +func TestAbs(t *testing.T) { + + v1 := []int32{1, -1, 2, -2} + fmt.Println(Abs(v1)) + v2 := []int64{1, -1, 2, -2} + fmt.Println(Abs(v2)) + v3 := []float32{1.1, -1.1, 2.2, -2.2} + fmt.Println(Abs(v3)) + v4 := []float64{1.1, -1.1, 2.2, -2.2} + fmt.Println(Abs(v4)) + +} diff --git a/stat/unsafe.go b/stat/unsafe.go new file mode 100644 index 0000000000000000000000000000000000000000..45766af889f148b4bb7d4bc65d084e19a2ebe0d9 --- /dev/null +++ b/stat/unsafe.go @@ -0,0 +1,8 @@ +package stat + +func math_abs[T StatType](v T) T { + if v < 0 { + return v * -1 + } + return v +} diff --git a/stat/unsafe_test.go b/stat/unsafe_test.go new file mode 100644 index 0000000000000000000000000000000000000000..e53ad50737f46ea9690f6b5ad51ad313de33e3ab --- /dev/null +++ b/stat/unsafe_test.go @@ -0,0 +1,12 @@ +package stat + +import ( + "fmt" + "testing" +) + +func Test_frombits(t *testing.T) { + i32_1 := float64(-1) + //fmt.Println(math.Abs(i32_1)) + fmt.Println(math_abs(i32_1)) +} diff --git a/stat/where.go b/stat/where.go index 929cd3e3a7eb776afa974d1d9cd12c7c5dcbe9ea..a7d52539391aebd540982b0bb813c3bc45fb2e11 100644 --- a/stat/where.go +++ b/stat/where.go @@ -2,7 +2,6 @@ package stat import ( "gitee.com/quant1x/pandas/algorithms/avx2" - "math" ) //func Where[T int64 | float64](condition any, params ...any) []T { @@ -18,39 +17,6 @@ import ( // params只支持两个默认值x和y, 如果condition为true返回x, 否则返回y // condition和param都可能是基础数据类型,也可能是一个slice, 并且长度可能不一致 // 直接写成序列版本, 可能更简单 -// func Where[T int64 | float64](condition []T, x, y []T) []T { -func Where1(condition []float64, x, y []float64) []float64 { - // 第一步, 找出最长的 - clen := len(condition) - xlen := len(x) - ylen := len(y) - // 第二步, 找出最大长度 - c := []float64{float64(clen), float64(xlen), float64(ylen)} - maxLength := int(avx2.Max(c)) - - // 对齐所有长度 - if clen < maxLength { - condition = align(condition, math.NaN(), maxLength) - } - if xlen < maxLength { - x = align(x, math.NaN(), maxLength) - } - if ylen < maxLength { - y = align(y, math.NaN(), maxLength) - } - // 初始化返回值 - d := make([]float64, maxLength) - for i := 0; i < maxLength; i++ { - // NaN也被认为是真 - if condition[i] != 0 { - d[i] = x[i] - } else { - d[i] = y[i] - } - } - return d -} - func Where[T StatType](condition []T, x, y []T) []T { // 第一步, 找出最长的 clen := len(condition)