diff --git a/Project.toml b/Project.toml index ed35dd2f..ff74e438 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "StaticArrays" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.5.16" +version = "1.5.17" [deps] LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" diff --git a/src/lu.jl b/src/lu.jl index 582487ee..9d2f8e57 100644 --- a/src/lu.jl +++ b/src/lu.jl @@ -68,10 +68,6 @@ function _first_zero_on_diagonal(A::StaticLUMatrix{M,N,T}) where {M,N,T} end end -function _first_zero_on_diagonal(A::LinearAlgebra.AbstractTriangular{<:Any,<:StaticMatrix}) - _first_zero_on_diagonal(A.data) -end - issuccess(F::LU) = _first_zero_on_diagonal(F.U) == 0 @generated function _lu(A::StaticLUMatrix{M,N,T}, pivot, check) where {M,N,T} diff --git a/src/traits.jl b/src/traits.jl index 94054140..ab1aa366 100644 --- a/src/traits.jl +++ b/src/traits.jl @@ -16,7 +16,10 @@ Size(::Type{Transpose{T, A}}) where {T, A <: AbstractVecOrMat{T}} = Size(Size(A) Size(::Type{Symmetric{T, A}}) where {T, A <: AbstractMatrix{T}} = Size(A) Size(::Type{Hermitian{T, A}}) where {T, A <: AbstractMatrix{T}} = Size(A) Size(::Type{Diagonal{T, A}}) where {T, A <: AbstractVector{T}} = Size(Size(A)[1], Size(A)[1]) -Size(::Type{<:LinearAlgebra.AbstractTriangular{T, A}}) where {T,A} = Size(A) +Size(::Type{UpperTriangular{T, A}}) where {T,A} = Size(A) +Size(::Type{UnitUpperTriangular{T, A}}) where {T,A} = Size(A) +Size(::Type{LowerTriangular{T, A}}) where {T,A} = Size(A) +Size(::Type{UnitLowerTriangular{T, A}}) where {T,A} = Size(A) struct Length{L} function Length{L}() where L diff --git a/src/triangular.jl b/src/triangular.jl index 99e5fb80..ef8294df 100644 --- a/src/triangular.jl +++ b/src/triangular.jl @@ -1,3 +1,5 @@ +const StaticULT{TA} = Union{UpperTriangular{TA,<:StaticMatrix},LowerTriangular{TA,<:StaticMatrix},UnitUpperTriangular{TA,<:StaticMatrix},UnitLowerTriangular{TA,<:StaticMatrix}} + @inline transpose(A::LowerTriangular{<:Any,<:StaticMatrix}) = UpperTriangular(transpose(A.data)) @inline adjoint(A::LowerTriangular{<:Any,<:StaticMatrix}) = @@ -14,17 +16,15 @@ UnitLowerTriangular(transpose(A.data)) @inline adjoint(A::UnitUpperTriangular{<:Any,<:StaticMatrix}) = UnitLowerTriangular(adjoint(A.data)) -@inline Base.:*(A::Adjoint{<:Any,<:StaticVector}, B::LinearAlgebra.AbstractTriangular{<:Any,<:StaticMatrix}) = +@inline Base.:*(A::Adjoint{<:Any,<:StaticVector}, B::StaticULT{<:Any}) = adjoint(adjoint(B) * adjoint(A)) -@inline Base.:*(A::Transpose{<:Any,<:StaticVector}, B::LinearAlgebra.AbstractTriangular{<:Any,<:StaticMatrix}) = +@inline Base.:*(A::Transpose{<:Any,<:StaticVector}, B::StaticULT{<:Any}) = transpose(transpose(B) * transpose(A)) -@inline Base.:*(A::LinearAlgebra.AbstractTriangular{<:Any,<:StaticMatrix}, B::Adjoint{<:Any,<:StaticVector}) = +@inline Base.:*(A::StaticULT{<:Any}, B::Adjoint{<:Any,<:StaticVector}) = adjoint(adjoint(B) * adjoint(A)) -@inline Base.:*(A::LinearAlgebra.AbstractTriangular{<:Any,<:StaticMatrix}, B::Transpose{<:Any,<:StaticVector}) = +@inline Base.:*(A::StaticULT{<:Any}, B::Transpose{<:Any,<:StaticVector}) = transpose(transpose(B) * transpose(A)) -const StaticULT{TA} = Union{UpperTriangular{TA,<:StaticMatrix},LowerTriangular{TA,<:StaticMatrix},UnitUpperTriangular{TA,<:StaticMatrix},UnitLowerTriangular{TA,<:StaticMatrix}} - @inline Base.:\(A::StaticULT, B::StaticVecOrMatLike) = _A_ldiv_B(Size(A), Size(B), A, B) @inline Base.:/(A::StaticVecOrMatLike, B::StaticULT) = transpose(transpose(B) \ transpose(A)) @@ -73,3 +73,7 @@ const StaticULT{TA} = Union{UpperTriangular{TA,<:StaticMatrix},LowerTriangular{T @inbounds return similar_type(B, TAB)(tuple($(X...))) end end + +function _first_zero_on_diagonal(A::StaticULT) + _first_zero_on_diagonal(A.data) +end