diff --git a/lapack/gonum/dlanhs.go b/lapack/gonum/dlanhs.go index 9df33e16..88c78624 100644 --- a/lapack/gonum/dlanhs.go +++ b/lapack/gonum/dlanhs.go @@ -15,15 +15,19 @@ import ( // the infinity norm, or the element of largest absolute value of a // Hessenberg matrix A. // -// On using norm=lapack.MaxRowSum, the vector work must have length n. +// On using norm=lapack.MaxColumnSum, the vector work must have length n. func (impl Implementation) Dlanhs(norm lapack.MatrixNorm, n int, a []float64, lda int, work []float64) float64 { switch { case n < 0: panic(nLT0) case lda < max(1, n): panic(badLdA) - case norm == lapack.MaxRowSum && len(work) < n: + case len(a) < (n-1)*lda+n: + panic(shortA) + case norm == lapack.MaxColumnSum && len(work) < n: panic(badLWork) + case norm != lapack.MaxRowSum && norm != lapack.MaxAbs && norm != lapack.MaxColumnSum && norm != lapack.Frobenius: + panic(badNorm) } if n == 0 { return 0 // Early return. @@ -32,8 +36,6 @@ func (impl Implementation) Dlanhs(norm lapack.MatrixNorm, n int, a []float64, ld bi := blas64.Implementation() var value float64 switch norm { - default: - panic(badNorm) case lapack.MaxAbs: for i := 0; i < n; i++ { minj := max(0, i-1) diff --git a/lapack/testlapack/dlanhs.go b/lapack/testlapack/dlanhs.go index ac782507..9cd92b98 100644 --- a/lapack/testlapack/dlanhs.go +++ b/lapack/testlapack/dlanhs.go @@ -19,13 +19,17 @@ type Dlanhser interface { func DlanhsTest(t *testing.T, impl Dlanhser) { const tol = 1e-15 - work := make([]float64, 9) + allwork := make([]float64, 9) rnd := rand.New(rand.NewSource(1)) for _, n := range []int{1, 2, 4, 9} { for _, lda := range []int{n, n + 5} { a := randomHessenberg(n, lda, rnd) for _, norm := range []lapack.MatrixNorm{lapack.MaxAbs, lapack.MaxRowSum, lapack.MaxColumnSum, lapack.Frobenius} { - for i := range work[:n] { + var work []float64 + if norm == lapack.MaxColumnSum { + work = allwork[:n] + } + for i := range work { work[i] = math.NaN() } want := dlange(norm, a.Rows, a.Cols, a.Data, a.Stride)