@@ -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'
0 commit comments