1 // Copyright ©2013 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 "golang.org/x/exp/rand"
13 func TestLQ(t *testing.T) {
14 for _, test := range []struct {
22 a := NewDense(m, n, nil)
23 for i := 0; i < m; i++ {
24 for j := 0; j < n; j++ {
25 a.Set(i, j, rand.NormFloat64())
35 if !isOrthonormal(q, 1e-10) {
36 t.Errorf("Q is not orthonormal: m = %v, n = %v", m, n)
43 if !EqualApprox(&got, &want, 1e-12) {
44 t.Errorf("LQ does not equal original matrix. \nWant: %v\nGot: %v", want, got)
49 func TestSolveLQ(t *testing.T) {
50 for _, trans := range []bool{false, true} {
51 for _, test := range []struct {
62 a := NewDense(m, n, nil)
63 for i := 0; i < m; i++ {
64 for j := 0; j < n; j++ {
65 a.Set(i, j, rand.Float64())
72 b := NewDense(br, bc, nil)
73 for i := 0; i < br; i++ {
74 for j := 0; j < bc; j++ {
75 b.Set(i, j, rand.Float64())
81 lq.Solve(&x, trans, b)
83 // Test that the normal equations hold.
84 // A^T * A * x = A^T * b if !trans
85 // A * A^T * x = A * b if trans
99 if !EqualApprox(&lhs, &rhs, 1e-10) {
100 t.Errorf("Normal equations do not hold.\nLHS: %v\n, RHS: %v\n", lhs, rhs)
104 // TODO(btracey): Add in testOneInput when it exists.
107 func TestSolveLQVec(t *testing.T) {
108 for _, trans := range []bool{false, true} {
109 for _, test := range []struct {
117 a := NewDense(m, n, nil)
118 for i := 0; i < m; i++ {
119 for j := 0; j < n; j++ {
120 a.Set(i, j, rand.Float64())
127 b := NewVecDense(br, nil)
128 for i := 0; i < br; i++ {
129 b.SetVec(i, rand.Float64())
134 lq.SolveVec(&x, trans, b)
136 // Test that the normal equations hold.
137 // A^T * A * x = A^T * b if !trans
138 // A * A^T * x = A * b if trans
152 if !EqualApprox(&lhs, &rhs, 1e-10) {
153 t.Errorf("Normal equations do not hold.\nLHS: %v\n, RHS: %v\n", lhs, rhs)
157 // TODO(btracey): Add in testOneInput when it exists.
160 func TestSolveLQCond(t *testing.T) {
161 for _, test := range []*Dense{
162 NewDense(2, 2, []float64{1, 0, 0, 1e-20}),
163 NewDense(2, 3, []float64{1, 0, 0, 0, 1e-20, 0}),
168 b := NewDense(m, 2, nil)
170 if err := lq.Solve(&x, false, b); err == nil {
171 t.Error("No error for near-singular matrix in matrix solve.")
174 bvec := NewVecDense(m, nil)
176 if err := lq.SolveVec(&xvec, false, bvec); err == nil {
177 t.Error("No error for near-singular matrix in matrix solve.")