@@ -850,9 +850,11 @@ function ^(A::SelfAdjoint, p::Real)
850850 isinteger (p) && return integerpow (A, p)
851851 F = eigen (A)
852852 if all (λ -> λ ≥ 0 , F. values)
853- return wrappertype (A)((F. vectors * Diagonal ((F. values). ^ p)) * F. vectors' )
853+ retmat = (F. vectors * Diagonal ((F. values). ^ p)) * F. vectors'
854+ return wrappertype (A)(retmat)
854855 else
855- return nonhermitianwrappertype (A)((F. vectors * Diagonal (complex .(F. values).^ p)) * F. vectors' )
856+ retmat = (F. vectors * Diagonal (complex .(F. values).^ p)) * F. vectors'
857+ return nonhermitianwrappertype (A)(retmat)
856858 end
857859end
858860function ^ (A:: SymSymTri{<:Complex} , p:: Real )
@@ -864,24 +866,28 @@ for func in (:exp, :cos, :sin, :tan, :cosh, :sinh, :tanh, :atan, :asinh, :atanh,
864866 @eval begin
865867 function ($ func)(A:: SelfAdjoint )
866868 F = eigen (A)
867- return wrappertype (A)((F. vectors * Diagonal (($ func). (F. values))) * F. vectors' )
869+ retmat = (F. vectors * Diagonal (($ func). (F. values))) * F. vectors'
870+ return wrappertype (A)(retmat)
868871 end
869872 end
870873end
871874
872875function cis (A:: SelfAdjoint )
873876 F = eigen (A)
874- return nonhermitianwrappertype (A)(F. vectors .* cis .(F. values' ) * F. vectors' )
877+ retmat = F. vectors .* cis .(F. values' ) * F. vectors'
878+ return nonhermitianwrappertype (A)(retmat)
875879end
876880
877881for func in (:acos , :asin )
878882 @eval begin
879883 function ($ func)(A:: SelfAdjoint )
880884 F = eigen (A)
881885 if all (λ -> - 1 ≤ λ ≤ 1 , F. values)
882- return wrappertype (A)((F. vectors * Diagonal (($ func). (F. values))) * F. vectors' )
886+ retmat = (F. vectors * Diagonal (($ func). (F. values))) * F. vectors'
887+ return wrappertype (A)(retmat)
883888 else
884- return nonhermitianwrappertype (A)((F. vectors * Diagonal (($ func). (complex .(F. values)))) * F. vectors' )
889+ retmat = (F. vectors * Diagonal (($ func). (complex .(F. values)))) * F. vectors'
890+ return nonhermitianwrappertype (A)(retmat)
885891 end
886892 end
887893 end
890896function acosh (A:: SelfAdjoint )
891897 F = eigen (A)
892898 if all (λ -> λ ≥ 1 , F. values)
893- return wrappertype (A)((F. vectors * Diagonal (acosh .(F. values))) * F. vectors' )
899+ retmat = (F. vectors * Diagonal (acosh .(F. values))) * F. vectors'
900+ return wrappertype (A)(retmat)
894901 else
895- return nonhermitianwrappertype (A)((F. vectors * Diagonal (acosh .(complex .(F. values)))) * F. vectors' )
902+ retmat = (F. vectors * Diagonal (acosh .(complex .(F. values)))) * F. vectors'
903+ return nonhermitianwrappertype (A)(retmat)
896904 end
897905end
898906
910918function log (A:: SelfAdjoint )
911919 F = eigen (A)
912920 if all (λ -> λ > 0 , F. values)
913- return wrappertype (A)((F. vectors * Diagonal (log .(F. values))) * F. vectors' )
921+ retmat = (F. vectors * Diagonal (log .(F. values))) * F. vectors'
922+ return wrappertype (A)(retmat)
914923 else
915- return nonhermitianwrappertype (A)((F. vectors * Diagonal (log .(complex .(F. values)))) * F. vectors' )
924+ retmat = (F. vectors * Diagonal (log .(complex .(F. values)))) * F. vectors'
925+ return nonhermitianwrappertype (A)(retmat)
916926 end
917927end
918928
@@ -921,9 +931,11 @@ function sqrt(A::SelfAdjoint; rtol = eps(real(float(eltype(A)))) * size(A, 1))
921931 F = eigen (A)
922932 λ₀ = - maximum (abs, F. values) * rtol # treat λ ≥ λ₀ as "zero" eigenvalues up to roundoff
923933 if all (λ -> λ ≥ λ₀, F. values)
924- return wrappertype (A)((F. vectors * Diagonal (sqrt .(max .(0 , F. values)))) * F. vectors' )
934+ retmat = (F. vectors * Diagonal (sqrt .(max .(0 , F. values)))) * F. vectors'
935+ return wrappertype (A)(retmat)
925936 else
926- return nonhermitianwrappertype (A)((F. vectors * Diagonal (sqrt .(complex .(F. values)))) * F. vectors' )
937+ retmat = (F. vectors * Diagonal (sqrt .(complex .(F. values)))) * F. vectors'
938+ return nonhermitianwrappertype (A)(retmat)
927939 end
928940end
929941
0 commit comments