diff --git a/src/dense.jl b/src/dense.jl index e68f7e94..21017c7e 100644 --- a/src/dense.jl +++ b/src/dense.jl @@ -1587,24 +1587,25 @@ factorize(A::Transpose) = transpose(factorize(parent(A))) factorize(a::Number) = a # same as how factorize behaves on Diagonal types function getstructure(A::StridedMatrix) + require_one_based_indexing(A) m, n = size(A) if m == 1 return A[1] end utri = true utri1 = true herm = true sym = true - for j = 1:n-1, i = j+1:m - if utri1 + for j = 1:n, i = j:m + if (j < n) && (i > j) && utri1 # indices are off-diagonal if A[i,j] != 0 utri1 = i == j + 1 utri = false end end if sym - sym &= A[i,j] == A[j,i] + sym &= A[i,j] == transpose(A[j,i]) end if herm - herm &= A[i,j] == conj(A[j,i]) + herm &= A[i,j] == adjoint(A[j,i]) end if !(utri1|herm|sym) break end end @@ -1617,10 +1618,12 @@ function getstructure(A::StridedMatrix) if ltri1 for i = 1:n-1 if A[i,i+1] != 0 - ltri &= false + ltri = false break end end + else + ltri = false end return (utri, utri1, ltri, ltri1, sym, herm) end diff --git a/test/dense.jl b/test/dense.jl index 236587df..79492bdb 100644 --- a/test/dense.jl +++ b/test/dense.jl @@ -1347,4 +1347,11 @@ end end end +@testset "structure of dense matrices" begin + # A is neither triangular nor symmetric/Hermitian + A = [1 im 2; -im 0 3; 2 3 im] + @test factorize(A) isa LU{ComplexF64, Matrix{ComplexF64}, Vector{Int}} + @test !any(LinearAlgebra.getstructure(A)) +end + end # module TestDense