1 // Copyright ©2015 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.
11 "golang.org/x/exp/rand"
13 "gonum.org/v1/gonum/blas/blas64"
14 "gonum.org/v1/gonum/lapack"
17 type Dlanger interface {
18 Dlange(norm lapack.MatrixNorm, m, n int, a []float64, lda int, work []float64) float64
21 func DlangeTest(t *testing.T, impl Dlanger) {
22 rnd := rand.New(rand.NewSource(1))
23 for _, test := range []struct {
37 a := make([]float64, m*lda)
39 a[i] = rnd.Float64() - 0.5
41 work := make([]float64, n)
43 work[i] = rnd.Float64()
45 aCopy := make([]float64, len(a))
49 norm := impl.Dlange(lapack.MaxAbs, m, n, a, lda, work)
51 for i := 0; i < m; i++ {
52 idx := blas64.Iamax(n, blas64.Vector{Inc: 1, Data: aCopy[i*lda:]})
53 ans = math.Max(ans, math.Abs(a[i*lda+idx]))
55 // Should be strictly equal because there is no floating point summation error.
57 t.Errorf("MaxAbs mismatch. Want %v, got %v.", ans, norm)
60 // Test MaxColumnSum norm.
61 norm = impl.Dlange(lapack.MaxColumnSum, m, n, a, lda, work)
63 for i := 0; i < n; i++ {
64 sum := blas64.Asum(m, blas64.Vector{Inc: lda, Data: aCopy[i:]})
65 ans = math.Max(ans, sum)
67 if math.Abs(norm-ans) > 1e-14 {
68 t.Errorf("MaxColumnSum mismatch. Want %v, got %v.", ans, norm)
71 // Test MaxRowSum norm.
72 norm = impl.Dlange(lapack.MaxRowSum, m, n, a, lda, work)
74 for i := 0; i < m; i++ {
75 sum := blas64.Asum(n, blas64.Vector{Inc: 1, Data: aCopy[i*lda:]})
76 ans = math.Max(ans, sum)
78 if math.Abs(norm-ans) > 1e-14 {
79 t.Errorf("MaxRowSum mismatch. Want %v, got %v.", ans, norm)
82 // Test Frobenius norm
83 norm = impl.Dlange(lapack.NormFrob, m, n, a, lda, work)
85 for i := 0; i < m; i++ {
86 sum := blas64.Nrm2(n, blas64.Vector{Inc: 1, Data: aCopy[i*lda:]})
90 if math.Abs(norm-ans) > 1e-14 {
91 t.Errorf("NormFrob mismatch. Want %v, got %v.", ans, norm)