@@ -69,10 +69,94 @@ Random.seed!(42)
6969 end
7070end
7171
72+
7273@testset " QR method ambiguity" begin
7374 # Issue #931; just test that methods do not throw an ambiguity error when called
7475 A = @SMatrix [1.0 2.0 3.0 ; 4.0 5.0 6.0 ]
7576 @test isa (qr (A), StaticArrays. QR)
7677 @test isa (qr (A, Val (true )), StaticArrays. QR)
7778 @test isa (qr (A, Val (false )), StaticArrays. QR)
78- end
79+ end
80+
81+
82+ @testset " #1192 The following functions are available for the QR objects: inv, size, and \\ ." begin
83+ @testset " pivot=$pivot " for pivot in [Val (true ), Val (false )] # , ColumnNorm()]
84+ y = @SVector rand (5 )
85+ Y = @SMatrix rand (5 ,5 )
86+ A = @SMatrix rand (5 ,5 )
87+ A_over = @SMatrix rand (5 ,6 )
88+ A_under = @SMatrix rand (5 ,4 )
89+
90+ F = qr (A, pivot)
91+ F_over = qr (A_over, pivot)
92+ F_under = qr (A_under, pivot)
93+
94+ @testset " size" begin
95+ @test size (A) == (5 ,5 )
96+ @test size (A_over) == (5 ,6 )
97+ @test size (A_under) == (5 ,4 )
98+ end
99+
100+ @testset " square inversion" begin
101+ A_inv = inv (F)
102+ @test inv (F) * A ≈ I (5 )
103+ @test inv (F) ≈ inv (qr (Matrix (A)))
104+ @test_throws DimensionMismatch inv (F_under)
105+ @test_throws DimensionMismatch inv (F_over)
106+ end
107+
108+ @testset " solve linear system" begin
109+ x = Matrix (A) \ Vector (y)
110+ @test x ≈ A \ y ≈ F \ y ≈ F \ Vector (y)
111+
112+ x_under = Matrix (A_under) \ Vector (y)
113+ @test x_under == A_under \ y
114+ @test x_under ≈ F_under \ y
115+ @test F_under \ y == F_under \ Vector (y)
116+
117+ x_over = Matrix (A_over) \ Vector (y)
118+ @test x_over ≈ A_over \ y
119+ @test A_over * x_over ≈ y
120+
121+ @test_throws DimensionMismatch F_over \ y
122+ @test_throws DimensionMismatch qr (Matrix (A_over)) \ y
123+ end
124+
125+ @testset " solve several linear systems" begin
126+ @test F \ Y ≈ A \ Y
127+ @test F_under \ Y ≈ A_under \ Y
128+ end
129+
130+ @testset " ldiv!" begin
131+ x = @MVector zeros (5 )
132+ ldiv! (x, F, y)
133+ @test x ≈ A \ y
134+
135+ X = @MMatrix zeros (5 ,5 )
136+ Y = @SMatrix rand (5 ,5 )
137+ ldiv! (X, F, Y)
138+ @test X ≈ A \ Y
139+ end
140+
141+ @testset " invperm" begin
142+ x = @SVector [10 ,15 ,3 ,7 ]
143+ p = @SVector [4 ,2 ,1 ,3 ]
144+ @test x == x[p][invperm (p)]
145+ @test StaticArrays. is_identity_perm (p[invperm (p)])
146+ @test_throws Union{BoundsError,ArgumentError} invperm (x)
147+ end
148+
149+ @testset " 10x faster" begin
150+ time_to_test = @elapsed (function ()
151+ y2 = @SVector rand (50 )
152+ A2 = @SMatrix rand (50 ,5 )
153+ F2 = qr (A2, pivot)
154+
155+ min_time_to_solve = minimum (@elapsed (A2 \ y2) for _ in 1 : 1_000 )
156+ min_time_to_solve_qr = minimum (@elapsed (F2 \ y2) for _ in 1 : 1_000 )
157+ @test 10 min_time_to_solve_qr < min_time_to_solve
158+ end )()
159+ @test time_to_test < 10
160+ end
161+ end
162+ end
0 commit comments