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.
10 "gonum.org/v1/gonum/blas"
11 "gonum.org/v1/gonum/lapack"
14 // Dlantr computes the specified norm of an m×n trapezoidal matrix A. If
15 // norm == lapack.MaxColumnSum work must have length at least n, otherwise work
17 func (impl Implementation) Dlantr(norm lapack.MatrixNorm, uplo blas.Uplo, diag blas.Diag, m, n int, a []float64, lda int, work []float64) float64 {
18 checkMatrix(m, n, a, lda)
20 case lapack.MaxRowSum, lapack.MaxColumnSum, lapack.NormFrob, lapack.MaxAbs:
24 if uplo != blas.Upper && uplo != blas.Lower {
27 if diag != blas.Unit && diag != blas.NonUnit {
30 if norm == lapack.MaxColumnSum && len(work) < n {
40 if diag == blas.Unit {
42 if uplo == blas.Upper {
43 for i := 0; i < m; i++ {
44 for j := i + 1; j < n; j++ {
45 tmp := math.Abs(a[i*lda+j])
56 for i := 1; i < m; i++ {
57 for j := 0; j < min(i, n); j++ {
58 tmp := math.Abs(a[i*lda+j])
70 if uplo == blas.Upper {
71 for i := 0; i < m; i++ {
72 for j := i; j < n; j++ {
73 tmp := math.Abs(a[i*lda+j])
84 for i := 0; i < m; i++ {
85 for j := 0; j <= min(i, n-1); j++ {
86 tmp := math.Abs(a[i*lda+j])
96 case lapack.MaxColumnSum:
97 if diag == blas.Unit {
98 for i := 0; i < min(m, n); i++ {
101 for i := min(m, n); i < n; i++ {
104 if uplo == blas.Upper {
105 for i := 0; i < m; i++ {
106 for j := i + 1; j < n; j++ {
107 work[j] += math.Abs(a[i*lda+j])
111 for i := 1; i < m; i++ {
112 for j := 0; j < min(i, n); j++ {
113 work[j] += math.Abs(a[i*lda+j])
118 for i := 0; i < n; i++ {
121 if uplo == blas.Upper {
122 for i := 0; i < m; i++ {
123 for j := i; j < n; j++ {
124 work[j] += math.Abs(a[i*lda+j])
128 for i := 0; i < m; i++ {
129 for j := 0; j <= min(i, n-1); j++ {
130 work[j] += math.Abs(a[i*lda+j])
136 for _, v := range work[:n] {
145 case lapack.MaxRowSum:
147 if diag == blas.Unit {
148 if uplo == blas.Upper {
149 for i := 0; i < m; i++ {
154 for j := i + 1; j < n; j++ {
155 sum += math.Abs(a[i*lda+j])
166 for i := 1; i < m; i++ {
171 for j := 0; j < min(i, n); j++ {
172 sum += math.Abs(a[i*lda+j])
184 if uplo == blas.Upper {
185 for i := 0; i < m; i++ {
187 for j := i; j < n; j++ {
188 sum += math.Abs(a[i*lda+j])
199 for i := 0; i < m; i++ {
201 for j := 0; j <= min(i, n-1); j++ {
202 sum += math.Abs(a[i*lda+j])
214 case lapack.NormFrob:
216 if diag == blas.Unit {
217 if uplo == blas.Upper {
218 for i := 0; i < m; i++ {
219 for j := i + 1; j < n; j++ {
225 for i := 1; i < m; i++ {
226 for j := 0; j < min(i, n); j++ {
232 nrm += float64(min(m, n))
234 if uplo == blas.Upper {
235 for i := 0; i < m; i++ {
236 for j := i; j < n; j++ {
237 tmp := math.Abs(a[i*lda+j])
242 for i := 0; i < m; i++ {
243 for j := 0; j <= min(i, n-1); j++ {
244 tmp := math.Abs(a[i*lda+j])
250 return math.Sqrt(nrm)