Skip to content

Commit a59b6cc

Browse files
authored
Merge pull request #770 from tpapp/tp/det-cleanup
Define logabsdet(::SMatrix), det & friends for LU
2 parents 71d3e35 + 92165f2 commit a59b6cc

File tree

4 files changed

+44
-10
lines changed

4 files changed

+44
-10
lines changed

src/StaticArrays.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ using LinearAlgebra
1818
import LinearAlgebra: transpose, adjoint, dot, eigvals, eigen, lyap, tr,
1919
kron, diag, norm, dot, diagm, lu, svd, svdvals,
2020
factorize, ishermitian, issymmetric, isposdef, issuccess, normalize,
21-
normalize!, Eigen, det, logdet, cross, diff, qr, \
21+
normalize!, Eigen, det, logdet, logabsdet, cross, diff, qr, \
2222
using LinearAlgebra: checksquare
2323

2424
export SOneTo
@@ -128,6 +128,7 @@ include("arraymath.jl")
128128
include("linalg.jl")
129129
include("matrix_multiply_add.jl")
130130
include("matrix_multiply.jl")
131+
include("lu.jl")
131132
include("det.jl")
132133
include("inv.jl")
133134
include("solve.jl")
@@ -138,7 +139,6 @@ include("lyap.jl")
138139
include("triangular.jl")
139140
include("cholesky.jl")
140141
include("svd.jl")
141-
include("lu.jl")
142142
include("qr.jl")
143143
include("deque.jl")
144144
include("flatten.jl")

src/det.jl

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,31 @@ end
4242
-2*rem(s, 2) + 1
4343
end
4444

45+
det(F::LU) = det(F.U) * _parity(F.p)
46+
47+
function logabsdet(A::Union{LowerTriangular{<:Any,<:StaticMatrix},
48+
UpperTriangular{<:Any,<:StaticMatrix}})
49+
checksquare(A)
50+
mapreduce(x -> (log(abs(x)), sign(x)), ((l1, s1), (l2, s2)) -> (l1 + l2, s1 * s2),
51+
diag(A))
52+
end
53+
54+
function logdet(F::LU)
55+
d, s = logabsdet(F.U)
56+
d + log(s * _parity(F.p))
57+
end
58+
59+
function logabsdet(F::LU)
60+
d, s = logabsdet(F.U)
61+
d, s * _parity(F.p)
62+
end
63+
4564
@generated function _det(::Size{S}, A::StaticMatrix) where S
4665
checksquare(A)
4766
if prod(S) 14*14
4867
quote
4968
@_inline_meta
50-
_, U, p = _lu(A, Val(true), false)
51-
det(UpperTriangular(U))*_parity(p)
69+
det(lu(A, Val(true); check = false))
5270
end
5371
else
5472
:(@_inline_meta; det(Matrix(A)))
@@ -62,11 +80,22 @@ end
6280
if prod(S) 14*14
6381
quote
6482
@_inline_meta
65-
LUp = lu(A; check = false)
66-
d, s = logabsdet(LUp.U)
67-
d + log(s*_parity(LUp.p))
83+
logdet(lu(A, Val(true); check = false))
6884
end
6985
else
7086
:(@_inline_meta; logdet(drop_sdims(A)))
7187
end
7288
end
89+
90+
@inline logabsdet(A::StaticMatrix) = _logabsdet(Size(A), A)
91+
@generated function _logabsdet(::Size{S}, A::StaticMatrix) where S
92+
checksquare(A)
93+
if prod(S) 14*14
94+
quote
95+
@_inline_meta
96+
logabsdet(lu(A, Val(true); check = false))
97+
end
98+
else
99+
:(@_inline_meta; logabsdet(drop_sdims(A)))
100+
end
101+
end

src/lu.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ issuccess(F::LU) = _first_zero_on_diagonal(F.U) == 0
8484
L = similar_type(A, T2, Size($M, $(min(M,N))))(f.L)
8585
U = similar_type(A, T2, Size($(min(M,N)), $N))(f.U)
8686
p = similar_type(A, Int, Size($M))(f.p)
87-
(L,U,p)
87+
L, U, p
8888
end
8989
end
9090
end

test/det.jl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,17 @@ using StaticArrays, Test, LinearAlgebra
2929
for sz in (5, 8, 15), typ in (Float64, Complex{Float64})
3030
A = rand(typ, sz, sz)
3131
SA = SMatrix{sz,sz,typ}(A)
32-
@test det(A) det(SA)
32+
@test det(A) det(SA) == det(lu(SA))
3333
if typ == Float64 && det(A) < 0
3434
A[:,1], A[:,2] = A[:,2], A[:,1]
3535
SA = SMatrix{sz,sz,typ}(A)
3636
end
37-
@test logdet(A) logdet(SA)
37+
@test logdet(A) logdet(SA) == logdet(lu(SA))
38+
dA, sA = logabsdet(A)
39+
dSA, sSA = logabsdet(SA)
40+
dLU, sLU = logabsdet(lu(SA))
41+
@test dA dSA == dLU
42+
@test sA sSA == sLU
3843
end
3944

4045
@test_throws DimensionMismatch det(@SMatrix [0; 1])

0 commit comments

Comments
 (0)