+++ /dev/null
-// 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/lapack"
-)
-
-// Dlascl multiplies an m×n matrix by the scalar cto/cfrom.
-//
-// cfrom must not be zero, and cto and cfrom must not be NaN, otherwise Dlascl
-// will panic.
-//
-// Dlascl is an internal routine. It is exported for testing purposes.
-func (impl Implementation) Dlascl(kind lapack.MatrixType, kl, ku int, cfrom, cto float64, m, n int, a []float64, lda int) {
- checkMatrix(m, n, a, lda)
- if cfrom == 0 {
- panic(zeroDiv)
- }
- if math.IsNaN(cfrom) || math.IsNaN(cto) {
- panic(nanScale)
- }
- if n == 0 || m == 0 {
- return
- }
- smlnum := dlamchS
- bignum := 1 / smlnum
- cfromc := cfrom
- ctoc := cto
- cfrom1 := cfromc * smlnum
- for {
- var done bool
- var mul, ctol float64
- if cfrom1 == cfromc {
- // cfromc is inf.
- mul = ctoc / cfromc
- done = true
- ctol = ctoc
- } else {
- ctol = ctoc / bignum
- if ctol == ctoc {
- // ctoc is either 0 or inf.
- mul = ctoc
- done = true
- cfromc = 1
- } else if math.Abs(cfrom1) > math.Abs(ctoc) && ctoc != 0 {
- mul = smlnum
- done = false
- cfromc = cfrom1
- } else if math.Abs(ctol) > math.Abs(cfromc) {
- mul = bignum
- done = false
- ctoc = ctol
- } else {
- mul = ctoc / cfromc
- done = true
- }
- }
- switch kind {
- default:
- panic("lapack: not implemented")
- case lapack.General:
- for i := 0; i < m; i++ {
- for j := 0; j < n; j++ {
- a[i*lda+j] = a[i*lda+j] * mul
- }
- }
- case lapack.UpperTri:
- for i := 0; i < m; i++ {
- for j := i; j < n; j++ {
- a[i*lda+j] = a[i*lda+j] * mul
- }
- }
- case lapack.LowerTri:
- for i := 0; i < m; i++ {
- for j := 0; j <= min(i, n-1); j++ {
- a[i*lda+j] = a[i*lda+j] * mul
- }
- }
- }
- if done {
- break
- }
- }
-}