OSDN Git Service

new repo
[bytom/vapor.git] / vendor / gonum.org / v1 / gonum / lapack / testlapack / dlanst.go
1 // Copyright ©2016 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 testlapack
6
7 import (
8         "math"
9         "testing"
10
11         "golang.org/x/exp/rand"
12
13         "gonum.org/v1/gonum/lapack"
14 )
15
16 type Dlanster interface {
17         Dlanst(norm lapack.MatrixNorm, n int, d, e []float64) float64
18         Dlanger
19 }
20
21 func DlanstTest(t *testing.T, impl Dlanster) {
22         rnd := rand.New(rand.NewSource(1))
23         for _, norm := range []lapack.MatrixNorm{lapack.MaxAbs, lapack.MaxColumnSum, lapack.MaxRowSum, lapack.NormFrob} {
24                 for _, n := range []int{1, 3, 10, 100} {
25                         for cas := 0; cas < 100; cas++ {
26                                 d := make([]float64, n)
27                                 for i := range d {
28                                         d[i] = rnd.NormFloat64()
29                                 }
30                                 e := make([]float64, n-1)
31                                 for i := range e {
32                                         e[i] = rnd.NormFloat64()
33                                 }
34
35                                 m := n
36                                 lda := n
37                                 a := make([]float64, m*lda)
38                                 for i := 0; i < n; i++ {
39                                         a[i*lda+i] = d[i]
40                                 }
41                                 for i := 0; i < n-1; i++ {
42                                         a[i*lda+i+1] = e[i]
43                                         a[(i+1)*lda+i] = e[i]
44                                 }
45                                 work := make([]float64, n)
46                                 syNorm := impl.Dlanst(norm, n, d, e)
47                                 geNorm := impl.Dlange(norm, m, n, a, lda, work)
48                                 if math.Abs(syNorm-geNorm) > 1e-12 {
49                                         t.Errorf("Norm mismatch: norm = %v, cas = %v, n = %v. Want %v, got %v.", string(norm), cas, n, geNorm, syNorm)
50                                 }
51                         }
52                 }
53         }
54 }