mirror of
https://github.com/gonum/gonum.git
synced 2025-10-05 23:26:52 +08:00
90 lines
1.8 KiB
Go
90 lines
1.8 KiB
Go
// 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 native
|
||
|
||
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
|
||
}
|
||
}
|
||
}
|