@@ -5,48 +5,42 @@ module TestLQ
5
5
using Test, LinearAlgebra, Random
6
6
using LinearAlgebra: BlasComplex, BlasFloat, BlasReal, rmul!, lmul!
7
7
8
- n = 10
9
-
10
- # Split n into 2 parts for tests needing two matrices
11
- n1 = div (n, 2 )
12
- n2 = 2 * n1
8
+ m = 10
13
9
14
10
Random. seed! (1234321 )
15
11
16
- areal = randn (n,n)/ 2
17
- aimg = randn (n,n)/ 2
18
- a2real = randn (n,n)/ 2
19
- a2img = randn (n,n)/ 2
20
- breal = randn (n,2 )/ 2
21
- bimg = randn (n,2 )/ 2
12
+ asquare = randn (ComplexF64, m, m) / 2
13
+ awide = randn (ComplexF64, m, m+ 3 ) / 2
14
+ bcomplex = randn (ComplexF64, m, 2 ) / 2
22
15
23
16
# helper functions to unambiguously recover explicit forms of an LQPackedQ
24
17
squareQ (Q:: LinearAlgebra.LQPackedQ ) = (n = size (Q. factors, 2 ); lmul! (Q, Matrix {eltype(Q)} (I, n, n)))
25
18
rectangularQ (Q:: LinearAlgebra.LQPackedQ ) = convert (Array, Q)
26
19
27
- @testset for eltya in (Float32, Float64, ComplexF32, ComplexF64)
28
- a = eltya == Int ? rand (1 : 7 , n, n) : convert (Matrix{eltya}, eltya <: Complex ? complex .(areal, aimg) : areal)
29
- a2 = eltya == Int ? rand (1 : 7 , n, n) : convert (Matrix{eltya}, eltya <: Complex ? complex .(a2real, a2img) : a2real)
30
- asym = a' + a # symmetric indefinite
31
- apd = a' * a # symmetric positive-definite
20
+ @testset for eltya in (Float32, Float64, ComplexF32, ComplexF64), n in (m, size (awide, 2 ))
21
+ adata = m == n ? asquare : awide
22
+ a = convert (Matrix{eltya}, eltya <: Complex ? adata : real (adata))
32
23
ε = εa = eps (abs (float (one (eltya))))
24
+ n1 = n ÷ 2
25
+
26
+ α = rand (eltya)
27
+ aα = fill (α,1 ,1 )
28
+ @test lq (α). L* lq (α). Q ≈ lq (aα). L* lq (aα). Q
29
+ @test abs (lq (α). Q[1 ,1 ]) ≈ one (eltya)
33
30
34
31
@testset for eltyb in (Float32, Float64, ComplexF32, ComplexF64, Int)
35
- b = eltyb == Int ? rand (1 : 5 , n , 2 ) : convert (Matrix{eltyb}, eltyb <: Complex ? complex .(breal, bimg) : breal )
32
+ b = eltyb == Int ? rand (1 : 5 , m , 2 ) : convert (Matrix{eltyb}, eltyb <: Complex ? bcomplex : real (bcomplex) )
36
33
εb = eps (abs (float (one (eltyb))))
37
34
ε = max (εa,εb)
38
35
39
- α = rand (eltya)
40
- aα = fill (α,1 ,1 )
41
- @test lq (α). L* lq (α). Q ≈ lq (aα). L* lq (aα). Q
42
- @test abs (lq (α). Q[1 ,1 ]) ≈ one (eltya)
43
36
tab = promote_type (eltya,eltyb)
44
37
45
- for i = 1 : 2
46
- let a = i == 1 ? a : view (a, 1 : n - 1 , 1 : n - 1 ), b = i == 1 ? b : view (b, 1 : n - 1 ), n = i == 1 ? n : n - 1
38
+ @testset for isview in ( false , true )
39
+ let a = isview ? view (a, 1 : m - 1 , 1 : n - 1 ) : a , b = isview ? view (b, 1 : m - 1 ) : b, m = m - isview, n = n - isview
47
40
lqa = lq (a)
41
+ x = lqa\ b
48
42
l,q = lqa. L, lqa. Q
49
- qra = qr (a)
43
+ qra = qr (a, Val ( true ) )
50
44
@testset " Basic ops" begin
51
45
@test size (lqa,1 ) == size (a,1 )
52
46
@test size (lqa,3 ) == 1
@@ -69,30 +63,31 @@ rectangularQ(Q::LinearAlgebra.LQPackedQ) = convert(Array, Q)
69
63
@test Matrix {eltya} (q) isa Matrix{eltya}
70
64
end
71
65
@testset " Binary ops" begin
72
- @test a* (lqa\ b) ≈ b atol= 3000 ε
73
- @test lqa* b ≈ qra. Q* qra. R* b atol= 3000 ε
74
- @test (sq = size (q. factors, 2 ); * (Matrix {eltyb} (I, sq, sq), adjoint (q))* squareQ (q)) ≈ Matrix (I, n, n) atol= 5000 ε
66
+ @test a* x ≈ b rtol= 3000 ε
67
+ @test x ≈ qra \ b rtol= 3000 ε
68
+ @test lqa* x ≈ a* x rtol= 3000 ε
69
+ @test (sq = size (q. factors, 2 ); * (Matrix {eltyb} (I, sq, sq), adjoint (q))* squareQ (q)) ≈ Matrix (I, n, n) rtol= 5000 ε
75
70
if eltya != Int
76
71
@test Matrix {eltyb} (I, n, n)* q ≈ convert (AbstractMatrix{tab},q)
77
72
end
78
- @test q* b ≈ squareQ (q)* b atol = 100 ε
79
- @test transpose (q)* b ≈ transpose (squareQ (q))* b atol = 100 ε
80
- @test q' * b ≈ squareQ (q)' * b atol = 100 ε
81
- @test a* q ≈ a* squareQ (q) atol = 100 ε
82
- @test a* transpose (q) ≈ a* transpose (squareQ (q)) atol = 100 ε
83
- @test a* q' ≈ a* squareQ (q)' atol = 100 ε
84
- @test a ' * q ≈ a ' * squareQ (q) atol = 100 ε
85
- @test a ' * q ' ≈ a ' * squareQ (q)' atol = 100 ε
86
- @test_throws DimensionMismatch q* b [1 : n1 + 1 ]
87
- @test_throws DimensionMismatch adjoint (q) * Matrix {eltya} (undef,n + 2 ,n + 2 )
88
- @test_throws DimensionMismatch Matrix {eltyb} (undef,n + 2 ,n + 2 )* q
73
+ @test q* x ≈ squareQ (q)* x rtol = 100 ε
74
+ @test transpose (q)* x ≈ transpose (squareQ (q))* x rtol = 100 ε
75
+ @test q' * x ≈ squareQ (q)' * x rtol = 100 ε
76
+ @test a* q ≈ a* squareQ (q) rtol = 100 ε
77
+ @test a* transpose (q) ≈ a* transpose (squareQ (q)) rtol = 100 ε
78
+ @test a* q' ≈ a* squareQ (q)' rtol = 100 ε
79
+ @test q * a ' ≈ squareQ (q)* a ' rtol = 100 ε
80
+ @test q ' * a ' ≈ squareQ (q)' * a ' rtol = 100 ε
81
+ @test_throws DimensionMismatch q* x [1 : n1 + 1 ]
82
+ @test_throws DimensionMismatch adjoint (q) * Matrix {eltya} (undef,m + 2 ,m + 2 )
83
+ @test_throws DimensionMismatch Matrix {eltyb} (undef,m + 2 ,m + 2 )* q
89
84
if isa (a, DenseArray) && isa (b, DenseArray)
90
85
# use this to test 2nd branch in mult code
91
86
pad_a = vcat (I, a)
92
- pad_b = hcat (I, b )
93
- @test pad_a* q ≈ pad_a* squareQ (q) atol = 100 ε
94
- @test transpose (q)* pad_b ≈ transpose (squareQ (q))* pad_b atol = 100 ε
95
- @test q' * pad_b ≈ squareQ (q)' * pad_b atol = 100 ε
87
+ pad_x = hcat (I, x )
88
+ @test pad_a* q ≈ pad_a* squareQ (q) rtol = 100 ε
89
+ @test transpose (q)* pad_x ≈ transpose (squareQ (q))* pad_x rtol = 100 ε
90
+ @test q' * pad_x ≈ squareQ (q)' * pad_x rtol = 100 ε
96
91
end
97
92
end
98
93
end
0 commit comments