mirror of
https://github.com/gonum/gonum.git
synced 2025-10-22 06:39:26 +08:00
@@ -48,6 +48,10 @@ func TestDlacn2(t *testing.T) {
|
|||||||
testlapack.Dlacn2Test(t, impl)
|
testlapack.Dlacn2Test(t, impl)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDlascl(t *testing.T) {
|
||||||
|
testlapack.DlasclTest(t, impl)
|
||||||
|
}
|
||||||
|
|
||||||
func TestDlacpy(t *testing.T) {
|
func TestDlacpy(t *testing.T) {
|
||||||
testlapack.DlacpyTest(t, impl)
|
testlapack.DlacpyTest(t, impl)
|
||||||
}
|
}
|
||||||
|
@@ -140,6 +140,10 @@ func TestDlas2(t *testing.T) {
|
|||||||
testlapack.Dlas2Test(t, impl)
|
testlapack.Dlas2Test(t, impl)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDlascl(t *testing.T) {
|
||||||
|
testlapack.DlasclTest(t, impl)
|
||||||
|
}
|
||||||
|
|
||||||
func TestDlaset(t *testing.T) {
|
func TestDlaset(t *testing.T) {
|
||||||
testlapack.DlasetTest(t, impl)
|
testlapack.DlasetTest(t, impl)
|
||||||
}
|
}
|
||||||
|
106
testlapack/dlascl.go
Normal file
106
testlapack/dlascl.go
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
// Copyright ©2016 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 testlapack
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"math/rand"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/gonum/lapack"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Dlascler interface {
|
||||||
|
Dlascl(kind lapack.MatrixType, kl, ku int, cfrom, cto float64, m, n int, a []float64, lda int)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DlasclTest(t *testing.T, impl Dlascler) {
|
||||||
|
const tol = 1e-16
|
||||||
|
|
||||||
|
rnd := rand.New(rand.NewSource(1))
|
||||||
|
for ti, test := range []struct {
|
||||||
|
m, n int
|
||||||
|
}{
|
||||||
|
{0, 0},
|
||||||
|
{1, 1},
|
||||||
|
{1, 10},
|
||||||
|
{10, 1},
|
||||||
|
{2, 2},
|
||||||
|
{2, 11},
|
||||||
|
{11, 2},
|
||||||
|
{3, 3},
|
||||||
|
{3, 11},
|
||||||
|
{11, 3},
|
||||||
|
{11, 11},
|
||||||
|
{11, 100},
|
||||||
|
{100, 11},
|
||||||
|
} {
|
||||||
|
m := test.m
|
||||||
|
n := test.n
|
||||||
|
for _, extra := range []int{0, 11} {
|
||||||
|
for _, kind := range []lapack.MatrixType{lapack.General, lapack.UpperTri, lapack.LowerTri} {
|
||||||
|
a := randomGeneral(m, n, n+extra, rnd)
|
||||||
|
aCopy := cloneGeneral(a)
|
||||||
|
cfrom := rnd.NormFloat64()
|
||||||
|
cto := rnd.NormFloat64()
|
||||||
|
scale := cto / cfrom
|
||||||
|
|
||||||
|
impl.Dlascl(kind, -1, -1, cfrom, cto, m, n, a.Data, a.Stride)
|
||||||
|
|
||||||
|
prefix := fmt.Sprintf("Case #%v: kind=%v,m=%v,n=%v,extra=%v", ti, kind, m, n, extra)
|
||||||
|
if !generalOutsideAllNaN(a) {
|
||||||
|
t.Errorf("%v: out-of-range write to A", prefix)
|
||||||
|
}
|
||||||
|
switch kind {
|
||||||
|
case lapack.General:
|
||||||
|
for i := 0; i < m; i++ {
|
||||||
|
for j := 0; j < n; j++ {
|
||||||
|
want := scale * aCopy.Data[i*aCopy.Stride+j]
|
||||||
|
got := a.Data[i*a.Stride+j]
|
||||||
|
if math.Abs(want-got) > tol {
|
||||||
|
t.Errorf("%v: unexpected A[%v,%v]=%v, want %v", prefix, i, j, got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case lapack.UpperTri:
|
||||||
|
for i := 0; i < m; i++ {
|
||||||
|
for j := i; j < n; j++ {
|
||||||
|
want := scale * aCopy.Data[i*aCopy.Stride+j]
|
||||||
|
got := a.Data[i*a.Stride+j]
|
||||||
|
if math.Abs(want-got) > tol {
|
||||||
|
t.Errorf("%v: unexpected A[%v,%v]=%v, want %v", prefix, i, j, got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i := 0; i < m; i++ {
|
||||||
|
for j := 0; j < min(i, n); j++ {
|
||||||
|
if a.Data[i*a.Stride+j] != aCopy.Data[i*aCopy.Stride+j] {
|
||||||
|
t.Errorf("%v: unexpected modification in lower triangle of A", prefix)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case lapack.LowerTri:
|
||||||
|
for i := 0; i < m; i++ {
|
||||||
|
for j := 0; j <= min(i, n-1); j++ {
|
||||||
|
want := scale * aCopy.Data[i*aCopy.Stride+j]
|
||||||
|
got := a.Data[i*a.Stride+j]
|
||||||
|
if math.Abs(want-got) > tol {
|
||||||
|
t.Errorf("%v: unexpected A[%v,%v]=%v, want %v", prefix, i, j, got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i := 0; i < m; i++ {
|
||||||
|
for j := i + 1; j < n; j++ {
|
||||||
|
if a.Data[i*a.Stride+j] != aCopy.Data[i*aCopy.Stride+j] {
|
||||||
|
t.Errorf("%v: unexpected modification in upper triangle of A", prefix)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user