diff --git a/stdlib/LinearAlgebra/src/diagonal.jl b/stdlib/LinearAlgebra/src/diagonal.jl index 32e2fa61fa680..bbeb2a50a9a93 100644 --- a/stdlib/LinearAlgebra/src/diagonal.jl +++ b/stdlib/LinearAlgebra/src/diagonal.jl @@ -947,3 +947,6 @@ end function Base.muladd(A::Diagonal, B::Diagonal, z::Diagonal) Diagonal(A.diag .* B.diag .+ z.diag) end + +uppertriangular(D::Diagonal) = D +lowertriangular(D::Diagonal) = D diff --git a/stdlib/LinearAlgebra/src/symmetric.jl b/stdlib/LinearAlgebra/src/symmetric.jl index 410140bf7e8be..630cbe78ba5dc 100644 --- a/stdlib/LinearAlgebra/src/symmetric.jl +++ b/stdlib/LinearAlgebra/src/symmetric.jl @@ -281,21 +281,21 @@ diag(A::Hermitian) = hermitian.(diag(parent(A)), sym_uplo(A.uplo)) function applytri(f, A::HermOrSym) if A.uplo == 'U' - f(UpperTriangular(A.data)) + f(uppertriangular(A.data)) else - f(LowerTriangular(A.data)) + f(lowertriangular(A.data)) end end function applytri(f, A::HermOrSym, B::HermOrSym) if A.uplo == B.uplo == 'U' - f(UpperTriangular(A.data), UpperTriangular(B.data)) + f(uppertriangular(A.data), uppertriangular(B.data)) elseif A.uplo == B.uplo == 'L' - f(LowerTriangular(A.data), LowerTriangular(B.data)) + f(lowertriangular(A.data), lowertriangular(B.data)) elseif A.uplo == 'U' - f(UpperTriangular(A.data), UpperTriangular(_conjugation(B)(B.data))) + f(uppertriangular(A.data), uppertriangular(_conjugation(B)(B.data))) else # A.uplo == 'L' - f(UpperTriangular(_conjugation(A)(A.data)), UpperTriangular(B.data)) + f(uppertriangular(_conjugation(A)(A.data)), uppertriangular(B.data)) end end parentof_applytri(f, args...) = applytri(parent ∘ f, args...) diff --git a/stdlib/LinearAlgebra/src/triangular.jl b/stdlib/LinearAlgebra/src/triangular.jl index 5c3f728eeaa5e..922bd9a6bd91a 100644 --- a/stdlib/LinearAlgebra/src/triangular.jl +++ b/stdlib/LinearAlgebra/src/triangular.jl @@ -154,6 +154,12 @@ const UpperOrUnitUpperTriangular{T,S} = Union{UpperTriangular{T,S}, UnitUpperTri const LowerOrUnitLowerTriangular{T,S} = Union{LowerTriangular{T,S}, UnitLowerTriangular{T,S}} const UpperOrLowerTriangular{T,S} = Union{UpperOrUnitUpperTriangular{T,S}, LowerOrUnitLowerTriangular{T,S}} +uppertriangular(M) = UpperTriangular(M) +lowertriangular(M) = LowerTriangular(M) + +uppertriangular(U::UpperOrUnitUpperTriangular) = U +lowertriangular(U::LowerOrUnitLowerTriangular) = U + Base.dataids(A::UpperOrLowerTriangular) = Base.dataids(A.data) imag(A::UpperTriangular) = UpperTriangular(imag(A.data)) diff --git a/stdlib/LinearAlgebra/test/diagonal.jl b/stdlib/LinearAlgebra/test/diagonal.jl index aa960aaa53193..91e69c0e30bf9 100644 --- a/stdlib/LinearAlgebra/test/diagonal.jl +++ b/stdlib/LinearAlgebra/test/diagonal.jl @@ -1281,6 +1281,12 @@ end @test c == Diagonal([2,2,2,2]) end +@testset "uppertriangular/lowertriangular" begin + D = Diagonal([1,2]) + @test LinearAlgebra.uppertriangular(D) === D + @test LinearAlgebra.lowertriangular(D) === D +end + @testset "mul/div with an adjoint vector" begin A = [1.0;;] x = [1.0] diff --git a/stdlib/LinearAlgebra/test/symmetric.jl b/stdlib/LinearAlgebra/test/symmetric.jl index 7b42825a12681..f9da7d004822b 100644 --- a/stdlib/LinearAlgebra/test/symmetric.jl +++ b/stdlib/LinearAlgebra/test/symmetric.jl @@ -532,6 +532,31 @@ end @test kron(Sl,Su) == kron(MSl,MSu) end end + @testset "non-strided" begin + @testset "diagonal" begin + for ST1 in (Symmetric, Hermitian), uplo1 in (:L, :U) + m = ST1(Matrix{BigFloat}(undef,2,2), uplo1) + m.data[1,1] = 1 + m.data[2,2] = 3 + m.data[1+(uplo1==:L), 1+(uplo1==:U)] = 2 + A = Array(m) + for ST2 in (Symmetric, Hermitian), uplo2 in (:L, :U) + id = ST2(I(2), uplo2) + @test m + id == id + m == A + id + end + end + end + @testset "unit triangular" begin + for ST1 in (Symmetric, Hermitian), uplo1 in (:L, :U) + H1 = ST1(UnitUpperTriangular(big.(rand(Int8,4,4))), uplo1) + M1 = Matrix(H1) + for ST2 in (Symmetric, Hermitian), uplo2 in (:L, :U) + H2 = ST2(UnitUpperTriangular(big.(rand(Int8,4,4))), uplo2) + @test H1 + H2 == M1 + Matrix(H2) + end + end + end + end end # bug identified in PR #52318: dot products of quaternionic Hermitian matrices, diff --git a/stdlib/LinearAlgebra/test/triangular.jl b/stdlib/LinearAlgebra/test/triangular.jl index 9c23ec92fdc74..40319b644b3cf 100644 --- a/stdlib/LinearAlgebra/test/triangular.jl +++ b/stdlib/LinearAlgebra/test/triangular.jl @@ -998,6 +998,14 @@ end end end +@testset "uppertriangular/lowertriangular" begin + M = rand(2,2) + @test LinearAlgebra.uppertriangular(M) === UpperTriangular(M) + @test LinearAlgebra.lowertriangular(M) === LowerTriangular(M) + @test LinearAlgebra.uppertriangular(UnitUpperTriangular(M)) === UnitUpperTriangular(M) + @test LinearAlgebra.lowertriangular(UnitLowerTriangular(M)) === UnitLowerTriangular(M) +end + @testset "arithmetic with partly uninitialized matrices" begin @testset "$(typeof(A))" for A in (Matrix{BigFloat}(undef,2,2), Matrix{Complex{BigFloat}}(undef,2,2)') A[2,1] = eltype(A) <: Complex ? 4 + 3im : 4