OSDN Git Service

fix commands
[bytom/shuttle.git] / vendor / github.com / bytom / vendor / gonum.org / v1 / gonum / lapack / gonum / dlarfg.go
diff --git a/vendor/github.com/bytom/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfg.go b/vendor/github.com/bytom/vendor/gonum.org/v1/gonum/lapack/gonum/dlarfg.go
new file mode 100644 (file)
index 0000000..52a67a4
--- /dev/null
@@ -0,0 +1,62 @@
+// Copyright ©2015 The Gonum Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gonum
+
+import (
+       "math"
+
+       "gonum.org/v1/gonum/blas/blas64"
+)
+
+// Dlarfg generates an elementary reflector for a Householder matrix. It creates
+// a real elementary reflector of order n such that
+//  H * (alpha) = (beta)
+//      (    x)   (   0)
+//  H^T * H = I
+// H is represented in the form
+//  H = 1 - tau * (1; v) * (1 v^T)
+// where tau is a real scalar.
+//
+// On entry, x contains the vector x, on exit it contains v.
+//
+// Dlarfg is an internal routine. It is exported for testing purposes.
+func (impl Implementation) Dlarfg(n int, alpha float64, x []float64, incX int) (beta, tau float64) {
+       if n < 0 {
+               panic(nLT0)
+       }
+       if n <= 1 {
+               return alpha, 0
+       }
+       checkVector(n-1, x, incX)
+       bi := blas64.Implementation()
+       xnorm := bi.Dnrm2(n-1, x, incX)
+       if xnorm == 0 {
+               return alpha, 0
+       }
+       beta = -math.Copysign(impl.Dlapy2(alpha, xnorm), alpha)
+       safmin := dlamchS / dlamchE
+       knt := 0
+       if math.Abs(beta) < safmin {
+               // xnorm and beta may be inaccurate, scale x and recompute.
+               rsafmn := 1 / safmin
+               for {
+                       knt++
+                       bi.Dscal(n-1, rsafmn, x, incX)
+                       beta *= rsafmn
+                       alpha *= rsafmn
+                       if math.Abs(beta) >= safmin {
+                               break
+                       }
+               }
+               xnorm = bi.Dnrm2(n-1, x, incX)
+               beta = -math.Copysign(impl.Dlapy2(alpha, xnorm), alpha)
+       }
+       tau = (beta - alpha) / beta
+       bi.Dscal(n-1, 1/(alpha-beta), x, incX)
+       for j := 0; j < knt; j++ {
+               beta *= safmin
+       }
+       return beta, tau
+}