Skip to content

Commit 4467f8a

Browse files
committed
re-add copytri
1 parent 24a3000 commit 4467f8a

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

src/dense.jl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,9 @@ function (^)(A::AbstractMatrix{T}, p::Real) where T
614614

615615
# If possible, use diagonalization
616616
if ishermitian(A)
617-
return parent(Hermitian(A)^p)
617+
powerHermA = Hermitian(A)^p
618+
PP = parent(powerHermA)
619+
return ishermitian(powerHermA) ? copytri_maybe_inplace(PP, 'U', true) : PP
618620
end
619621

620622
# Otherwise, use Schur decomposition
@@ -744,7 +746,7 @@ function exp!(A::StridedMatrix{T}) where T<:BlasFloat
744746
end
745747
return A
746748
elseif ishermitian(A)
747-
return parent(exp(Hermitian(A)))
749+
return copytri!(parent(exp(Hermitian(A))), 'U', true)
748750
end
749751
ilo, ihi, scale = LAPACK.gebal!('B', A) # modifies A
750752
nA = opnorm(A, 1)
@@ -1010,7 +1012,9 @@ function sqrt(A::AbstractMatrix{T}) where {T<:Union{Real,Complex}}
10101012
return applydiagonal(sqrt, A)
10111013
end
10121014
elseif ishermitian(A)
1013-
return parent(sqrt(Hermitian(A)))
1015+
sqrtHermA = sqrt(Hermitian(A))
1016+
PS = parent(sqrtHermA)
1017+
return ishermitian(sqrtHermA) ? copytri_maybe_inplace(PS, 'U', true) : PS
10141018
elseif istriu(A)
10151019
return triu!(parent(sqrt(UpperTriangular(A))))
10161020
elseif isreal(A)
@@ -1077,7 +1081,7 @@ function cbrt(A::AbstractMatrix{<:Real})
10771081
elseif isdiag(A)
10781082
return applydiagonal(cbrt, A)
10791083
elseif issymmetric(A)
1080-
return copytri!(parent(cbrt(Symmetric(A))), 'U')
1084+
return copytri_maybe_inplace(parent(cbrt(Symmetric(A))), 'U')
10811085
else
10821086
S = schur(A)
10831087
return S.Z * _cbrt_quasi_triu!(S.T) * S.Z'

test/symmetric.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,12 +1220,12 @@ end
12201220
for f in (x->x^real(T)(0.3), sqrt, log, asin, acos, acosh, atanh)
12211221
if T <: Real
12221222
@test @inferred(Matrix{Complex{T}}, f(a)) isa Matrix
1223-
@test @inferred(Symmetric{Complex{T}} f(syma)) isa Symmetric
1224-
@test @inferred(Symmetric{Complex{T}} f(symtria)) isa Symmetric
1225-
@test @inferred(Symmetric{Complex{T}} f(herma)) isa Union{Symmetric{Complex{T}}, Hermitian{T}}
1223+
@test @inferred(Symmetric{Complex{T}}, f(syma)) isa Symmetric
1224+
@test @inferred(Symmetric{Complex{T}}, f(symtria)) isa Symmetric
1225+
@test @inferred(Symmetric{Complex{T}}, f(herma)) isa Union{Symmetric{Complex{T}}, Hermitian{T}}
12261226
else
12271227
@test @inferred(f(a)) isa Matrix{T}
1228-
@test @inferred(Matrix{T} f(herma)) isa Union{Matrix{T}, Hermitian{T}}
1228+
@test @inferred(Matrix{T}, f(herma)) isa Union{Matrix{T}, Hermitian{T}}
12291229
end
12301230
end
12311231
#nice functions

0 commit comments

Comments
 (0)