77 lines
1.7 KiB
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
|
||
|
}
|