OSDN Git Service

new repo
[bytom/vapor.git] / vendor / gonum.org / v1 / gonum / lapack / gonum / dlange.go
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.
4
5 package gonum
6
7 import (
8         "math"
9
10         "gonum.org/v1/gonum/lapack"
11 )
12
13 // Dlange computes the matrix norm of the general m×n matrix a. The input norm
14 // specifies the norm computed.
15 //  lapack.MaxAbs: the maximum absolute value of an element.
16 //  lapack.MaxColumnSum: the maximum column sum of the absolute values of the entries.
17 //  lapack.MaxRowSum: the maximum row sum of the absolute values of the entries.
18 //  lapack.NormFrob: the square root of the sum of the squares of the entries.
19 // If norm == lapack.MaxColumnSum, work must be of length n, and this function will panic otherwise.
20 // There are no restrictions on work for the other matrix norms.
21 func (impl Implementation) Dlange(norm lapack.MatrixNorm, m, n int, a []float64, lda int, work []float64) float64 {
22         // TODO(btracey): These should probably be refactored to use BLAS calls.
23         checkMatrix(m, n, a, lda)
24         switch norm {
25         case lapack.MaxRowSum, lapack.MaxColumnSum, lapack.NormFrob, lapack.MaxAbs:
26         default:
27                 panic(badNorm)
28         }
29         if norm == lapack.MaxColumnSum && len(work) < n {
30                 panic(badWork)
31         }
32         if m == 0 && n == 0 {
33                 return 0
34         }
35         if norm == lapack.MaxAbs {
36                 var value float64
37                 for i := 0; i < m; i++ {
38                         for j := 0; j < n; j++ {
39                                 value = math.Max(value, math.Abs(a[i*lda+j]))
40                         }
41                 }
42                 return value
43         }
44         if norm == lapack.MaxColumnSum {
45                 if len(work) < n {
46                         panic(badWork)
47                 }
48                 for i := 0; i < n; i++ {
49                         work[i] = 0
50                 }
51                 for i := 0; i < m; i++ {
52                         for j := 0; j < n; j++ {
53                                 work[j] += math.Abs(a[i*lda+j])
54                         }
55                 }
56                 var value float64
57                 for i := 0; i < n; i++ {
58                         value = math.Max(value, work[i])
59                 }
60                 return value
61         }
62         if norm == lapack.MaxRowSum {
63                 var value float64
64                 for i := 0; i < m; i++ {
65                         var sum float64
66                         for j := 0; j < n; j++ {
67                                 sum += math.Abs(a[i*lda+j])
68                         }
69                         value = math.Max(value, sum)
70                 }
71                 return value
72         }
73         if norm == lapack.NormFrob {
74                 var value float64
75                 scale := 0.0
76                 sum := 1.0
77                 for i := 0; i < m; i++ {
78                         scale, sum = impl.Dlassq(n, a[i*lda:], 1, scale, sum)
79                 }
80                 value = scale * math.Sqrt(sum)
81                 return value
82         }
83         panic("lapack: bad matrix norm")
84 }