route/vendor/github.com/aclements/go-moremath/vec/vec.go

77 lines
1.7 KiB
Go

// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package vec
import "math"
// Vectorize returns a function g(xs) that applies f to each x in xs.
//
// f may be evaluated in parallel and in any order.
func Vectorize(f func(float64) float64) func(xs []float64) []float64 {
return func(xs []float64) []float64 {
return Map(f, xs)
}
}
// Map returns f(x) for each x in xs.
//
// f may be evaluated in parallel and in any order.
func Map(f func(float64) float64, xs []float64) []float64 {
// TODO(austin) Parallelize
res := make([]float64, len(xs))
for i, x := range xs {
res[i] = f(x)
}
return res
}
// Linspace returns num values spaced evenly between lo and hi,
// inclusive. If num is 1, this returns an array consisting of lo.
func Linspace(lo, hi float64, num int) []float64 {
res := make([]float64, num)
if num == 1 {
res[0] = lo
return res
}
for i := 0; i < num; i++ {
res[i] = lo + float64(i)*(hi-lo)/float64(num-1)
}
return res
}
// Logspace returns num values spaced evenly on a logarithmic scale
// between base**lo and base**hi, inclusive.
func Logspace(lo, hi float64, num int, base float64) []float64 {
res := Linspace(lo, hi, num)
for i, x := range res {
res[i] = math.Pow(base, x)
}
return res
}
// Sum returns the sum of xs.
func Sum(xs []float64) float64 {
sum := 0.0
for _, x := range xs {
sum += x
}
return sum
}
// Concat returns the concatenation of its arguments. It does not
// modify its inputs.
func Concat(xss ...[]float64) []float64 {
total := 0
for _, xs := range xss {
total += len(xs)
}
out := make([]float64, total)
pos := 0
for _, xs := range xss {
pos += copy(out[pos:], xs)
}
return out
}