gonum.org/v1/gonum@v0.14.0/stat/distmat/unit_vector_test.go (about) 1 // Copyright ©2020 The Gonum Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package distmat 6 7 import ( 8 "testing" 9 10 "golang.org/x/exp/rand" 11 12 "gonum.org/v1/gonum/floats/scalar" 13 "gonum.org/v1/gonum/mat" 14 ) 15 16 func TestUnitVector(t *testing.T) { 17 u := NewUnitVector(rand.NewSource(1)) 18 for _, d := range []int{10, 32, 64, 100} { 19 v := mat.NewVecDense(d, nil) 20 u.UnitVecTo(v) 21 l := mat.Norm(v, 2) 22 if !scalar.EqualWithinAbs(l, 1.0, 1e-12) { 23 t.Errorf("expected length 1 but got %f", l) 24 } 25 } 26 } 27 28 func TestUnitVectorStats(t *testing.T) { 29 n := 1e7 30 u := NewUnitVector(rand.NewSource(1)) 31 for _, d := range []int{1, 2, 3} { 32 v := mat.NewVecDense(d, nil) 33 tot := mat.NewVecDense(d, nil) 34 for i := 0; i < int(n); i++ { 35 u.UnitVecTo(v) 36 tot.AddVec(tot, v) 37 } 38 tot.ScaleVec(1/n, tot) 39 // Each dimension should average out to 0. 40 for i := 0; i < d; i++ { 41 if !scalar.EqualWithinAbs(tot.AtVec(i), 0.0, 1e-3) { 42 t.Errorf("expected average entry 0 but got %f", tot.AtVec(i)) 43 } 44 } 45 l := mat.Norm(tot, 2) 46 // And the length should be 0. 47 if !scalar.EqualWithinAbs(l, 0.0, 1e-3) { 48 t.Errorf("expected length 0 but got %f", l) 49 } 50 } 51 }