Skip to content

Commit 2171e08

Browse files
committed
Randomized testing of inv() accuracy vs Base
1 parent eb5f105 commit 2171e08

File tree

1 file changed

+49
-17
lines changed

1 file changed

+49
-17
lines changed

test/inv.jl

Lines changed: 49 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using StaticArrays, Base.Test
2+
13
"""
24
Create an almost singular `Matrix{Float64}` of size `N×N`.
35
@@ -69,24 +71,54 @@ end
6971
end
7072

7173

72-
# Fuzz testing for inv()
74+
#-------------------------------------------------------------------------------
75+
# More comprehensive but qualitiative testing for inv() accuracy
7376
#=
74-
for i=1:100
75-
N = 4
76-
A = almost_singular_matrix(N, 3, 1e-7)
77-
SA = SMatrix{N,N}(A)
78-
SA_residual = norm(Matrix(SA*inv(SA) - eye(N)))
79-
A_residual = norm(A*inv(A) - eye(N))
80-
if SA_residual/A_residual > 10000
81-
@printf("%10e %.4f\n", SA_residual, SA_residual/A_residual)
82-
println("[")
83-
for i=1:4
84-
for j=1:4
85-
@printf("%.17e ", A[i,j])
86-
end
87-
println()
88-
end
89-
println("]")
77+
using PyPlot
78+
79+
inv_residual(A::AbstractMatrix) = norm(A*inv(A) - eye(size(A,1)))
80+
81+
"""
82+
plot_residuals(N, rank, ϵ)
83+
84+
Plot `inv_residual(::StaticMatrix)` vs `inv_residual(::Matrix)`
85+
86+
"""
87+
function plot_residuals(N, rank, ϵ)
88+
A_residuals = []
89+
SA_residuals = []
90+
for i=1:10000
91+
A = almost_singular_matrix(N, rank, ϵ)
92+
SA = SMatrix{N,N}(A)
93+
SA_residual = norm(Matrix(SA*inv(SA) - eye(N)))
94+
A_residual = norm(A*inv(A) - eye(N))
95+
push!(SA_residuals, SA_residual)
96+
push!(A_residuals, A_residual)
97+
#= if SA_residual/A_residual > 10000 =#
98+
#= @printf("%10e %.4f\n", SA_residual, SA_residual/A_residual) =#
99+
#= println("[") =#
100+
#= for i=1:4 =#
101+
#= for j=1:4 =#
102+
#= @printf("%.17e ", A[i,j]) =#
103+
#= end =#
104+
#= println() =#
105+
#= end =#
106+
#= println("]") =#
107+
#= end =#
90108
end
109+
loglog(SA_residuals, A_residuals, ".", markersize=1.5)
110+
end
111+
112+
# Plot the accuracy of inv implementations for almost singular matrices of
113+
# various rank
114+
clf()
115+
N = 4
116+
labels = []
117+
for i in N:-1:1
118+
plot_residuals(N, i, 1e-7)
119+
push!(labels, "rank $i")
91120
end
121+
xlabel("residual norm - inv(::StaticArray)")
122+
ylabel("residual norm - inv(::Array)")
123+
legend(labels)
92124
=#

0 commit comments

Comments
 (0)