Skip to content

Commit 9ba2a06

Browse files
committed
Define logabsdet(::SMatrix), det & friends for LU
1. define a logabsdet for SMatrix, fixes #489 2. define methods for det, logdet, logabsdet for LU (cf LinearAlgebra, which has these methods) 3. make det, logdet, logabsdet fall back to using the LU methods (to avoid code repetition) 4. include lu.jl first, since det.jl used code from it 5. incidental consistency fixes
1 parent 53b4a0e commit 9ba2a06

File tree

4 files changed

+37
-10
lines changed

4 files changed

+37
-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: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,24 @@ end
4242
-2*rem(s, 2) + 1
4343
end
4444

45+
det(F::LU) = det(F.U) * _parity(F.p)
46+
47+
function logdet(F::LU)
48+
d, s = logabsdet(F.U)
49+
d + log(s * _parity(F.p))
50+
end
51+
52+
function logabsdet(F::LU)
53+
d, s = logabsdet(F.U)
54+
d, s * _parity(F.p)
55+
end
56+
4557
@generated function _det(::Size{S}, A::StaticMatrix) where S
4658
checksquare(A)
4759
if prod(S) 14*14
4860
quote
4961
@_inline_meta
50-
_, U, p = _lu(A, Val(true), false)
51-
det(UpperTriangular(U))*_parity(p)
62+
det(lu(A, Val(true); check = false))
5263
end
5364
else
5465
:(@_inline_meta; det(Matrix(A)))
@@ -62,11 +73,22 @@ end
6273
if prod(S) 14*14
6374
quote
6475
@_inline_meta
65-
LUp = lu(A; check = false)
66-
d, s = logabsdet(LUp.U)
67-
d + log(s*_parity(LUp.p))
76+
logdet(lu(A, Val(true); check = false))
6877
end
6978
else
7079
:(@_inline_meta; logdet(drop_sdims(A)))
7180
end
7281
end
82+
83+
@inline logabsdet(A::StaticMatrix) = _logabsdet(Size(A), A)
84+
@generated function _logabsdet(::Size{S}, A::StaticMatrix) where S
85+
checksquare(A)
86+
if prod(S) 14*14
87+
quote
88+
@_inline_meta
89+
logabsdet(lu(A, Val(true); check = false))
90+
end
91+
else
92+
:(@_inline_meta; logabsdet(drop_sdims(A)))
93+
end
94+
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)