Files
gonum/internal/asm/c64/stubs.go
Dan Kortschak 5f0141ca4c all: run gofmt and generate all packages
Changes made in dsp/fourier/internal/fftpack break the formatting used
there, so these are reverted. There will be complaints in CI.

[git-generate]
gofmt -w .
go generate gonum.org/v1/gonum/blas
go generate gonum.org/v1/gonum/blas/gonum
go generate gonum.org/v1/gonum/unit
go generate gonum.org/v1/gonum/unit/constant
go generate gonum.org/v1/gonum/graph/formats/dot
go generate gonum.org/v1/gonum/graph/formats/rdf
go generate gonum.org/v1/gonum/stat/card

git checkout -- dsp/fourier/internal/fftpack
2022-08-06 07:05:17 +09:30

181 lines
2.9 KiB
Go

// Copyright ©2020 The Gonum 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 c64
import (
"gonum.org/v1/gonum/internal/cmplx64"
"gonum.org/v1/gonum/internal/math32"
)
// Add is
//
// for i, v := range s {
// dst[i] += v
// }
func Add(dst, s []complex64) {
for i, v := range s {
dst[i] += v
}
}
// AddConst is
//
// for i := range x {
// x[i] += alpha
// }
func AddConst(alpha complex64, x []complex64) {
for i := range x {
x[i] += alpha
}
}
// CumSum is
//
// if len(s) == 0 {
// return dst
// }
// dst[0] = s[0]
// for i, v := range s[1:] {
// dst[i+1] = dst[i] + v
// }
// return dst
func CumSum(dst, s []complex64) []complex64 {
if len(s) == 0 {
return dst
}
dst[0] = s[0]
for i, v := range s[1:] {
dst[i+1] = dst[i] + v
}
return dst
}
// CumProd is
//
// if len(s) == 0 {
// return dst
// }
// dst[0] = s[0]
// for i, v := range s[1:] {
// dst[i+1] = dst[i] * v
// }
// return dst
func CumProd(dst, s []complex64) []complex64 {
if len(s) == 0 {
return dst
}
dst[0] = s[0]
for i, v := range s[1:] {
dst[i+1] = dst[i] * v
}
return dst
}
// Div is
//
// for i, v := range s {
// dst[i] /= v
// }
func Div(dst, s []complex64) {
for i, v := range s {
dst[i] /= v
}
}
// DivTo is
//
// for i, v := range s {
// dst[i] = v / t[i]
// }
// return dst
func DivTo(dst, s, t []complex64) []complex64 {
for i, v := range s {
dst[i] = v / t[i]
}
return dst
}
// DotUnitary is
//
// for i, v := range x {
// sum += conj(v) * y[i]
// }
// return sum
func DotUnitary(x, y []complex64) (sum complex64) {
for i, v := range x {
sum += cmplx64.Conj(v) * y[i]
}
return sum
}
// L2DistanceUnitary returns the L2-norm of x-y.
func L2DistanceUnitary(x, y []complex64) (norm float32) {
var scale float32
sumSquares := float32(1.0)
for i, v := range x {
v -= y[i]
if v == 0 {
continue
}
absxi := cmplx64.Abs(v)
if math32.IsNaN(absxi) {
return math32.NaN()
}
if scale < absxi {
s := scale / absxi
sumSquares = 1 + sumSquares*s*s
scale = absxi
} else {
s := absxi / scale
sumSquares += s * s
}
}
if math32.IsInf(scale, 1) {
return math32.Inf(1)
}
return scale * math32.Sqrt(sumSquares)
}
// L2NormUnitary returns the L2-norm of x.
func L2NormUnitary(x []complex64) (norm float32) {
var scale float32
sumSquares := float32(1.0)
for _, v := range x {
if v == 0 {
continue
}
absxi := cmplx64.Abs(v)
if math32.IsNaN(absxi) {
return math32.NaN()
}
if scale < absxi {
s := scale / absxi
sumSquares = 1 + sumSquares*s*s
scale = absxi
} else {
s := absxi / scale
sumSquares += s * s
}
}
if math32.IsInf(scale, 1) {
return math32.Inf(1)
}
return scale * math32.Sqrt(sumSquares)
}
// Sum is
//
// var sum complex64
// for i := range x {
// sum += x[i]
// }
func Sum(x []complex64) complex64 {
var sum complex64
for _, v := range x {
sum += v
}
return sum
}