|
4 | 4 | # Test the pseudo-inverse |
5 | 5 | # |
6 | 6 |
|
7 | | -debug = false |
8 | | - |
9 | 7 | using Base.Test |
10 | 8 |
|
| 9 | +srand(12345) |
| 10 | + |
11 | 11 | function hilb(T::Type, n::Integer) |
12 | 12 | a=Array{T}(n,n) |
13 | 13 | for i=1:n |
|
89 | 89 |
|
90 | 90 |
|
91 | 91 | function test_pinv(a,m,n,tol1,tol2,tol3) |
92 | | - debug && println("=== julia/matlab pinv, default tol=eps(1.0)*max(size(a)) ===") |
93 | 92 | apinv = @inferred pinv(a) |
94 | 93 |
|
95 | 94 | @test vecnorm(a*apinv*a-a)/vecnorm(a) ≈ 0 atol=tol1 |
96 | 95 | x0 = randn(n); b = a*x0; x = apinv*b |
97 | 96 | @test vecnorm(a*x-b)/vecnorm(b) ≈ 0 atol=tol1 |
98 | | - debug && println(vecnorm(a*apinv*a - a)/vecnorm(a)) |
99 | | - debug && println(vecnorm(a*x-b)/vecnorm(b)) |
100 | | - |
101 | | - |
102 | | - debug && println("=== julia pinv, tol=sqrt(eps(1.0)) ===") |
103 | 97 | apinv = pinv(a,sqrt(eps(real(one(eltype(a)))))) |
104 | 98 |
|
105 | 99 | @test vecnorm(a*apinv*a-a)/vecnorm(a) ≈ 0 atol=tol2 |
106 | 100 | x0 = randn(n); b = a*x0; x = apinv*b |
107 | 101 | @test vecnorm(a*x-b)/vecnorm(b) ≈ 0 atol=tol2 |
108 | | - debug && println(vecnorm(a*apinv*a - a)/vecnorm(a)) |
109 | | - debug && println(vecnorm(a*x-b)/vecnorm(b)) |
110 | 102 | end |
111 | 103 |
|
112 | | - |
113 | | -srand(12345) |
114 | | - |
115 | | -let |
116 | | - for eltya in (Float64, Complex128) |
117 | | - |
118 | | - debug && println("\n\n<<<<<", eltya, ">>>>>") |
119 | | - |
120 | | - m = 1000 |
121 | | - n = 100 |
122 | | - debug && println("\n\n n = ", n, ", m = ",m) |
123 | | - |
| 104 | +@testset for eltya in (Float32, Float64, Complex64, Complex128) |
| 105 | + @testset for (m, n) in [(1000, 100), (100, 100), (100, 1000)] |
124 | 106 | default_tol = (real(one(eltya))) * max(m,n) * 10 |
125 | | - |
126 | | - debug && println("\n--- dense/ill-conditioned matrix ---\n") |
127 | | - ### a = randn_float64(m,n) * hilb(eltya,n) |
128 | | - a = hilb(eltya,m,n) |
129 | | - test_pinv(a,m,n,1e-2,1e-5,1e-5) |
130 | | - |
131 | | - debug && println("\n--- dense/diagonal matrix ---\n") |
132 | | - a = onediag(eltya,m,n) |
133 | | - test_pinv(a,m,n,default_tol,default_tol,default_tol) |
134 | | - |
135 | | - debug && println("\n--- dense/tri-diagonal matrix ---\n") |
136 | | - a = tridiag(eltya,m,n) |
137 | | - test_pinv(a,m,n,default_tol,1e-5,default_tol) |
138 | | - |
139 | | - debug && println("\n--- Diagonal matrix ---\n") |
140 | | - a = onediag_sparse(eltya,m) |
141 | | - test_pinv(a,m,m,default_tol,default_tol,default_tol) |
142 | | - |
143 | | - m = 100 |
144 | | - n = 100 |
145 | | - debug && println("\n\n n = ", n, ", m = ",m) |
146 | | - |
147 | | - default_tol = (real(one(eltya))) * max(m,n) * 10 |
148 | | - |
149 | | - debug && println("\n--- dense/ill-conditioned matrix ---\n") |
| 107 | + tol1 = 1e-2 |
| 108 | + tol2 = 1e-5 |
| 109 | + tol3 = 1e-5 |
| 110 | + if real(eltya) == Float32 |
| 111 | + tol1 = 1e0 |
| 112 | + tol2 = 1e-2 |
| 113 | + tol3 = 1e-2 |
| 114 | + end |
| 115 | + @testset "dense/ill-conditioned matrix" begin |
150 | 116 | ### a = randn_float64(m,n) * hilb(eltya,n) |
151 | | - a = hilb(eltya,m,n) |
152 | | - test_pinv(a,m,n,1e-2,1e-5,1e-5) |
153 | | - |
154 | | - debug && println("\n--- dense/diagonal matrix ---\n") |
155 | | - a = onediag(eltya,m,n) |
156 | | - test_pinv(a,m,n,default_tol,default_tol,default_tol) |
157 | | - |
158 | | - debug && println("\n--- dense/tri-diagonal matrix ---\n") |
159 | | - a = tridiag(eltya,m,n) |
160 | | - test_pinv(a,m,n,default_tol,1e-5,default_tol) |
161 | | - |
162 | | - debug && println("\n--- Diagonal matrix ---\n") |
163 | | - a = onediag_sparse(eltya,m) |
164 | | - test_pinv(a,m,m,default_tol,default_tol,default_tol) |
165 | | - |
166 | | - m = 100 |
167 | | - n = 1000 |
168 | | - debug && println("\n\n n = ", n, ", m = ",m) |
169 | | - |
170 | | - default_tol = (real(one(eltya))) * max(m,n) * 10 |
171 | | - |
172 | | - debug && println("\n--- dense/ill-conditioned matrix ---\n") |
173 | | - ### a = randn_float64(m,n) * hilb(eltya,n) |
174 | | - a = hilb(eltya,m,n) |
175 | | - test_pinv(a,m,n,1e-2,1e-5,1e-5) |
176 | | - |
177 | | - debug && println("\n--- dense/diagonal matrix ---\n") |
178 | | - a = onediag(eltya,m,n) |
179 | | - test_pinv(a,m,n,default_tol,default_tol,default_tol) |
180 | | - |
181 | | - debug && println("\n--- dense/tri-diagonal matrix ---\n") |
182 | | - a = tridiag(eltya,m,n) |
183 | | - test_pinv(a,m,n,default_tol,1e-5,default_tol) |
184 | | - |
185 | | - debug && println("\n--- Diagonal matrix ---\n") |
186 | | - a = onediag_sparse(eltya,m) |
187 | | - test_pinv(a,m,m,default_tol,default_tol,default_tol) |
| 117 | + a = hilb(eltya, m, n) |
| 118 | + test_pinv(a, m, n, tol1, tol2, tol3) |
| 119 | + end |
| 120 | + @testset "dense/diagonal matrix" begin |
| 121 | + a = onediag(eltya, m, n) |
| 122 | + test_pinv(a, m, n, default_tol, default_tol, default_tol) |
| 123 | + end |
| 124 | + @testset "dense/tri-diagonal matrix" begin |
| 125 | + a = tridiag(eltya, m, n) |
| 126 | + test_pinv(a, m, n, default_tol, tol2, default_tol) |
| 127 | + end |
| 128 | + @testset "Diagonal matrix" begin |
| 129 | + a = onediag_sparse(eltya, m) |
| 130 | + test_pinv(a, m, m, default_tol, default_tol, default_tol) |
| 131 | + end |
188 | 132 | end |
189 | 133 | end |
190 | 134 |
|
| 135 | +@testset "zero valued numbers/vectors/matrices" begin |
| 136 | + @testset for eltya in (Float32, Float64, Complex64, Complex128) |
| 137 | + a = pinv(zero(eltya)) |
| 138 | + @test a ≈ 0.0 |
191 | 139 |
|
192 | | -for eltya in (Float32, Complex64) |
193 | | - |
194 | | - debug && println("\n\n<<<<<", eltya, ">>>>>") |
195 | | - |
196 | | - m = 1000 |
197 | | - n = 100 |
198 | | - debug && println("\n\n n = ", n, ", m = ",m) |
199 | | - |
200 | | - default_tol = (real(one(eltya))) * max(m,n) * 10 |
201 | | - |
202 | | - debug && println("\n--- dense/ill-conditioned matrix ---\n") |
203 | | -### a = randn_float32(m,n) * hilb(eltya,n) |
204 | | - a = hilb(eltya,m,n) |
205 | | - test_pinv(a,m,n,1e0,1e-2,1e-2) |
206 | | - |
207 | | - debug && println("\n--- dense/diagonal matrix ---\n") |
208 | | - a = onediag(eltya,m,n) |
209 | | - test_pinv(a,m,n,default_tol,default_tol,default_tol) |
210 | | - |
211 | | - debug && println("\n--- dense/tri-diagonal matrix ---\n") |
212 | | - a = tridiag(eltya,m,n) |
213 | | - test_pinv(a,m,n,default_tol,1e-2,default_tol) |
214 | | - |
215 | | - debug && println("\n--- Diagonal matrix ---\n") |
216 | | - a = onediag_sparse(eltya,m) |
217 | | - test_pinv(a,m,m,default_tol,default_tol,default_tol) |
218 | | - |
219 | | - m = 100 |
220 | | - n = 100 |
221 | | - debug && println("\n\n n = ", n, ", m = ",m) |
222 | | - |
223 | | - default_tol = (real(one(eltya))) * max(m,n) * 10 |
224 | | - |
225 | | - debug && println("\n--- dense/ill-conditioned matrix ---\n") |
226 | | -### a = randn_float32(m,n) * hilb(eltya,n) |
227 | | - a = hilb(eltya,m,n) |
228 | | - test_pinv(a,m,n,1e0,1e-2,1e-2) |
229 | | - |
230 | | - debug && println("\n--- dense/diagonal matrix ---\n") |
231 | | - a = onediag(eltya,m,n) |
232 | | - test_pinv(a,m,n,default_tol,default_tol,default_tol) |
233 | | - |
234 | | - debug && println("\n--- dense/tri-diagonal matrix ---\n") |
235 | | - a = tridiag(eltya,m,n) |
236 | | - test_pinv(a,m,n,default_tol,1e-2,default_tol) |
237 | | - |
238 | | - debug && println("\n--- Diagonal matrix ---\n") |
239 | | - a = onediag_sparse(eltya,m) |
240 | | - test_pinv(a,m,m,default_tol,default_tol,default_tol) |
241 | | - |
242 | | - m = 100 |
243 | | - n = 1000 |
244 | | - debug && println("\n\n n = ", n, ", m = ",m) |
245 | | - |
246 | | - default_tol = (real(one(eltya))) * max(m,n) * 10 |
| 140 | + a = pinv([zero(eltya); zero(eltya)]) |
| 141 | + @test a[1] ≈ 0.0 |
| 142 | + @test a[2] ≈ 0.0 |
247 | 143 |
|
248 | | - debug && println("\n--- dense/ill-conditioned matrix ---\n") |
249 | | -### a = randn_float32(m,n) * hilb(eltya,n) |
250 | | - a = hilb(eltya,m,n) |
251 | | - test_pinv(a,m,n,1e0,1e-2,1e-2) |
252 | | - |
253 | | - debug && println("\n--- dense/diagonal matrix ---\n") |
254 | | - a = onediag(eltya,m,n) |
255 | | - test_pinv(a,m,n,default_tol,default_tol,default_tol) |
256 | | - |
257 | | - debug && println("\n--- dense/tri-diagonal matrix ---\n") |
258 | | - a = tridiag(eltya,m,n) |
259 | | - test_pinv(a,m,n,default_tol,1e-2,default_tol) |
260 | | - |
261 | | - debug && println("\n--- Diagonal matrix ---\n") |
262 | | - a = onediag_sparse(eltya,m) |
263 | | - test_pinv(a,m,m,default_tol,default_tol,default_tol) |
264 | | - |
265 | | -end |
266 | | - |
267 | | -# test zero matrices |
268 | | -for eltya in (Float32, Float64, Complex64, Complex128) |
269 | | - debug && println("\n\n<<<<<", eltya, ">>>>>") |
270 | | - debug && println("\n--- zero constant ---") |
271 | | - a = pinv(zero(eltya)) |
272 | | - @test a ≈ 0.0 |
273 | | -end |
274 | | - |
275 | | -for eltya in (Float32, Float64, Complex64, Complex128) |
276 | | - debug && println("\n\n<<<<<", eltya, ">>>>>") |
277 | | - debug && println("\n--- zero vector ---") |
278 | | - a = pinv([zero(eltya); zero(eltya)]) |
279 | | - @test a[1] ≈ 0.0 |
280 | | - @test a[2] ≈ 0.0 |
281 | | -end |
282 | | - |
283 | | -for eltya in (Float32, Float64, Complex64, Complex128) |
284 | | - debug && println("\n\n<<<<<", eltya, ">>>>>") |
285 | | - debug && println("\n--- zero Diagonal matrix ---") |
286 | | - a = pinv(Diagonal([zero(eltya); zero(eltya)])) |
287 | | - @test a.diag[1] ≈ 0.0 |
288 | | - @test a.diag[2] ≈ 0.0 |
289 | | -end |
290 | | - |
291 | | -# test sub-normal matrices |
292 | | -for eltya in (Float32, Float64) |
293 | | - debug && println("\n\n<<<<<", eltya, ">>>>>") |
294 | | - debug && println("\n--- sub-normal constant ---") |
295 | | - a = pinv(realmin(eltya)/100) |
296 | | - @test a ≈ 0.0 |
297 | | - debug && println("\n\n<<<<<Complex{", eltya, "}>>>>>") |
298 | | - debug && println("\n--- sub-normal constant ---") |
299 | | - a = pinv(realmin(eltya)/100*(1+1im)) |
300 | | - @test a ≈ 0.0 |
301 | | -end |
302 | | - |
303 | | -for eltya in (Float32, Float64) |
304 | | - debug && println("\n\n<<<<<", eltya, ">>>>>") |
305 | | - debug && println("\n--- sub-normal vector ---") |
306 | | - a = pinv([realmin(eltya); realmin(eltya)]/100) |
307 | | - @test a[1] ≈ 0.0 |
308 | | - @test a[2] ≈ 0.0 |
309 | | - debug && println("\n\n<<<<<Complex{", eltya, "}>>>>>") |
310 | | - debug && println("\n--- sub-normal vector ---") |
311 | | - a = pinv([realmin(eltya); realmin(eltya)]/100*(1+1im)) |
312 | | - @test a[1] ≈ 0.0 |
313 | | - @test a[2] ≈ 0.0 |
| 144 | + a = pinv(Diagonal([zero(eltya); zero(eltya)])) |
| 145 | + @test a.diag[1] ≈ 0.0 |
| 146 | + @test a.diag[2] ≈ 0.0 |
| 147 | + end |
314 | 148 | end |
315 | 149 |
|
316 | | -for eltya in (Float32, Float64) |
317 | | - debug && println("\n\n<<<<<", eltya, ">>>>>") |
318 | | - debug && println("\n--- sub-normal Diagonal matrix ---") |
319 | | - a = pinv(Diagonal([realmin(eltya); realmin(eltya)]/100)) |
320 | | - @test a.diag[1] ≈ 0.0 |
321 | | - @test a.diag[2] ≈ 0.0 |
322 | | - debug && println("\n\n<<<<<Complex{", eltya, "}>>>>>") |
323 | | - debug && println("\n--- sub-normal Diagonal matrix ---") |
324 | | - a = pinv(Diagonal([realmin(eltya); realmin(eltya)]/100*(1+1im))) |
325 | | - @test a.diag[1] ≈ 0.0 |
326 | | - @test a.diag[2] ≈ 0.0 |
| 150 | +@testset "sub-normal numbers/vectors/matrices" begin |
| 151 | + @testset for eltya in (Float32, Float64) |
| 152 | + a = pinv(realmin(eltya)/100) |
| 153 | + @test a ≈ 0.0 |
| 154 | + # Complex subnormal |
| 155 | + a = pinv(realmin(eltya)/100*(1+1im)) |
| 156 | + @test a ≈ 0.0 |
| 157 | + |
| 158 | + a = pinv([realmin(eltya); realmin(eltya)]/100) |
| 159 | + @test a[1] ≈ 0.0 |
| 160 | + @test a[2] ≈ 0.0 |
| 161 | + # Complex subnormal |
| 162 | + a = pinv([realmin(eltya); realmin(eltya)]/100*(1+1im)) |
| 163 | + @test a[1] ≈ 0.0 |
| 164 | + @test a[2] ≈ 0.0 |
| 165 | + a = pinv(Diagonal([realmin(eltya); realmin(eltya)]/100)) |
| 166 | + @test a.diag[1] ≈ 0.0 |
| 167 | + @test a.diag[2] ≈ 0.0 |
| 168 | + # Complex subnormal |
| 169 | + a = pinv(Diagonal([realmin(eltya); realmin(eltya)]/100*(1+1im))) |
| 170 | + @test a.diag[1] ≈ 0.0 |
| 171 | + @test a.diag[2] ≈ 0.0 |
| 172 | + end |
327 | 173 | end |
0 commit comments