Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions stdlib/LinearAlgebra/src/diagonal.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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
12 changes: 6 additions & 6 deletions stdlib/LinearAlgebra/src/symmetric.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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...)
Expand Down
6 changes: 6 additions & 0 deletions stdlib/LinearAlgebra/src/triangular.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
6 changes: 6 additions & 0 deletions stdlib/LinearAlgebra/test/diagonal.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
25 changes: 25 additions & 0 deletions stdlib/LinearAlgebra/test/symmetric.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
8 changes: 8 additions & 0 deletions stdlib/LinearAlgebra/test/triangular.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down