@@ -95,7 +95,7 @@ isstructured(::Diagonal) = true
9595"""
9696 has_sparsestruct(x::AbstractArray)
9797
98- determine whether `findstructralnz` accepts the parameter `x`
98+ Determine whether `findstructralnz` accepts the parameter `x`
9999"""
100100has_sparsestruct (x) = false
101101has_sparsestruct (x:: AbstractArray ) = has_sparsestruct (typeof (x))
@@ -106,6 +106,24 @@ has_sparsestruct(x::Type{<:Bidiagonal}) = true
106106has_sparsestruct (x:: Type{<:Tridiagonal} ) = true
107107has_sparsestruct (x:: Type{<:SymTridiagonal} ) = true
108108
109+ """
110+ issingular(A::AbstractMatrix)
111+
112+ Determine whether a given abstract matrix is singular.
113+ """
114+ issingular (A:: AbstractMatrix ) = issingular (Matrix (A))
115+ issingular (A:: AbstractSparseMatrix ) = ! issuccess (lu (A, check= false ))
116+ issingular (A:: Matrix ) = ! issuccess (lu (A, check= false ))
117+ issingular (A:: UniformScaling ) = A. λ == 0
118+ issingular (A:: Diagonal ) = any (iszero,A. diag)
119+ issingular (B:: Bidiagonal ) = any (iszero, A. dv)
120+ issingular (S:: SymTridiagonal ) = diaganyzero (iszero, ldlt (S). data)
121+ issingular (T:: Tridiagonal ) = ! issuccess (lu (A, check= false ))
122+ issingular (A:: Union{Hermitian,Symmetric} ) = diaganyzero (bunchkaufman (A, check= false ). LD)
123+ issingular (A:: Union{LowerTriangular,UpperTriangular} ) = diaganyzero (A. data)
124+ issingular (A:: Union{UnitLowerTriangular,UnitUpperTriangular} ) = false
125+ diaganyzero (A) = any (iszero, view (A, diagind (A)))
126+
109127"""
110128 findstructralnz(x::AbstractArray)
111129
0 commit comments