Skip to content

Commit 547d461

Browse files
committed
Deprecate sqrtm in favor of sqrt.
1 parent 109b0b4 commit 547d461

File tree

13 files changed

+87
-55
lines changed

13 files changed

+87
-55
lines changed

NEWS.md

+2
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,8 @@ Deprecated or removed
336336
full path if you need access to executables or libraries in the `JULIA_HOME` directory, e.g.
337337
`joinpath(JULIA_HOME, "7z.exe")` for `7z.exe` ([#21540]).
338338

339+
* `sqrtm` has been deprecated in favor of `sqrt` ([#23504]).
340+
339341
* `expm` has been deprecated in favor of `exp` ([#23233]).
340342

341343
* Calling `union` with no arguments is deprecated; construct an empty set with an appropriate

base/deprecated.jl

+4-1
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ for f in (
253253
# base/math.jl
254254
:cbrt, :sinh, :cosh, :tanh, :atan, :asinh, :exp2,
255255
:expm1, :exp10, :sin, :cos, :tan, :asin, :acos, :acosh, :atanh,
256-
#=:log,=# :log2, :log10, :lgamma, #=:log1p,=# :sqrt,
256+
#=:log,=# :log2, :log10, :lgamma, #=:log1p,=#
257257
# base/floatfuncs.jl
258258
:abs, :abs2, :angle, :isnan, :isinf, :isfinite,
259259
# base/complex.jl
@@ -1660,6 +1660,9 @@ function Tridiagonal(dl::AbstractVector{Tl}, d::AbstractVector{Td}, du::Abstract
16601660
Tridiagonal(map(v->convert(Vector{promote_type(Tl,Td,Tu)}, v), (dl, d, du))...)
16611661
end
16621662

1663+
# deprecate sqrtm in favor of sqrt
1664+
@deprecate sqrtm sqrt
1665+
16631666
# deprecate expm in favor of exp
16641667
@deprecate expm! exp!
16651668
@deprecate expm exp

base/exports.jl

-1
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,6 @@ export
613613
schur,
614614
schurfact!,
615615
schurfact,
616-
sqrtm,
617616
svd,
618617
svdfact!,
619618
svdfact,

base/linalg/dense.jl

+14-16
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,8 @@ function schurpow(A::AbstractMatrix, p)
374374
retmat = A ^ floor(p)
375375
# Real part
376376
if p - floor(p) == 0.5
377-
# special case: A^0.5 === sqrtm(A)
378-
retmat = retmat * sqrtm(A)
377+
# special case: A^0.5 === sqrt(A)
378+
retmat = retmat * sqrt(A)
379379
else
380380
retmat = retmat * powm!(UpperTriangular(float.(A)), real(p - floor(p)))
381381
end
@@ -385,8 +385,8 @@ function schurpow(A::AbstractMatrix, p)
385385
R = S ^ floor(p)
386386
# Real part
387387
if p - floor(p) == 0.5
388-
# special case: A^0.5 === sqrtm(A)
389-
R = R * sqrtm(S)
388+
# special case: A^0.5 === sqrt(A)
389+
R = R * sqrt(S)
390390
else
391391
R = R * powm!(UpperTriangular(float.(S)), real(p - floor(p)))
392392
end
@@ -622,7 +622,7 @@ end
622622
logm(a::Complex) = log(a)
623623

624624
"""
625-
sqrtm(A)
625+
sqrt(A::AbstractMatrix)
626626
627627
If `A` has no negative real eigenvalues, compute the principal matrix square root of `A`,
628628
that is the unique matrix ``X`` with eigenvalues having positive real part such that
@@ -646,40 +646,38 @@ julia> A = [4 0; 0 4]
646646
4 0
647647
0 4
648648
649-
julia> sqrtm(A)
649+
julia> sqrt(A)
650650
2×2 Array{Float64,2}:
651651
2.0 0.0
652652
0.0 2.0
653653
```
654654
"""
655-
function sqrtm(A::StridedMatrix{<:Real})
655+
function sqrt(A::StridedMatrix{<:Real})
656656
if issymmetric(A)
657-
return full(sqrtm(Symmetric(A)))
657+
return full(sqrt(Symmetric(A)))
658658
end
659659
n = checksquare(A)
660660
if istriu(A)
661-
return full(sqrtm(UpperTriangular(A)))
661+
return full(sqrt(UpperTriangular(A)))
662662
else
663663
SchurF = schurfact(complex(A))
664-
R = full(sqrtm(UpperTriangular(SchurF[:T])))
664+
R = full(sqrt(UpperTriangular(SchurF[:T])))
665665
return SchurF[:vectors] * R * SchurF[:vectors]'
666666
end
667667
end
668-
function sqrtm(A::StridedMatrix{<:Complex})
668+
function sqrt(A::StridedMatrix{<:Complex})
669669
if ishermitian(A)
670-
return full(sqrtm(Hermitian(A)))
670+
return full(sqrt(Hermitian(A)))
671671
end
672672
n = checksquare(A)
673673
if istriu(A)
674-
return full(sqrtm(UpperTriangular(A)))
674+
return full(sqrt(UpperTriangular(A)))
675675
else
676676
SchurF = schurfact(A)
677-
R = full(sqrtm(UpperTriangular(SchurF[:T])))
677+
R = full(sqrt(UpperTriangular(SchurF[:T])))
678678
return SchurF[:vectors] * R * SchurF[:vectors]'
679679
end
680680
end
681-
sqrtm(a::Number) = (b = sqrt(complex(a)); imag(b) == 0 ? real(b) : b)
682-
sqrtm(a::Complex) = sqrt(a)
683681

684682
function inv(A::StridedMatrix{T}) where T
685683
checksquare(A)

base/linalg/diagonal.jl

+1-2
Original file line numberDiff line numberDiff line change
@@ -329,8 +329,7 @@ eye(::Type{Diagonal{T}}, n::Int) where {T} = Diagonal(ones(T,n))
329329
exp(D::Diagonal) = Diagonal(exp.(D.diag))
330330
logm(D::Diagonal) = Diagonal(log.(D.diag))
331331
logm(D::Diagonal{<:AbstractMatrix}) = Diagonal(logm.(D.diag))
332-
sqrtm(D::Diagonal) = Diagonal(sqrt.(D.diag))
333-
sqrtm(D::Diagonal{<:AbstractMatrix}) = Diagonal(sqrtm.(D.diag))
332+
sqrt(D::Diagonal) = Diagonal(sqrt.(D.diag))
334333

335334
#Linear solver
336335
function A_ldiv_B!(D::Diagonal, B::StridedVecOrMat)

base/linalg/linalg.jl

+1-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Base: USE_BLAS64, abs, big, broadcast, ceil, conj, convert, copy, copy!,
99
adjoint, eltype, exp, eye, findmax, findmin, fill!, floor, full, getindex,
1010
hcat, imag, indices, inv, isapprox, isone, IndexStyle, kron, length, map,
1111
ndims, oneunit, parent, power_by_squaring, print_matrix, promote_rule, real, round,
12-
setindex!, show, similar, size, transpose, trunc, typed_hcat
12+
setindex!, show, similar, size, sqrt, transpose, trunc, typed_hcat
1313
using Base: hvcat_fill, iszero, IndexLinear, _length, promote_op, promote_typeof,
1414
@propagate_inbounds, @pure, reduce, typed_vcat
1515
# We use `_length` because of non-1 indices; releases after julia 0.5
@@ -125,7 +125,6 @@ export
125125
schur,
126126
schurfact!,
127127
schurfact,
128-
sqrtm,
129128
svd,
130129
svdfact!,
131130
svdfact,

base/linalg/symmetric.jl

+34-1
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,40 @@ function exp(A::Hermitian{T}) where T
607607
end
608608
end
609609

610-
for (funm, func) in ([:logm,:log], [:sqrtm,:sqrt])
610+
for func in (:sqrt, #=:logm=#)
611+
@eval begin
612+
function ($func)(A::Symmetric{T}) where T<:Real
613+
F = eigfact(A)
614+
if all-> λ 0, F.values)
615+
retmat = (F.vectors * Diagonal(($func).(F.values))) * F.vectors'
616+
else
617+
retmat = (F.vectors * Diagonal(($func).(complex.(F.values)))) * F.vectors'
618+
end
619+
return Symmetric(retmat)
620+
end
621+
622+
function ($func)(A::Hermitian{T}) where T
623+
n = checksquare(A)
624+
F = eigfact(A)
625+
if all-> λ 0, F.values)
626+
retmat = (F.vectors * Diagonal(($func).(F.values))) * F.vectors'
627+
if T <: Real
628+
return Hermitian(retmat)
629+
else
630+
for i = 1:n
631+
retmat[i,i] = real(retmat[i,i])
632+
end
633+
return Hermitian(retmat)
634+
end
635+
else
636+
retmat = (F.vectors * Diagonal(($func).(complex(F.values)))) * F.vectors'
637+
return retmat
638+
end
639+
end
640+
end
641+
end
642+
643+
for (funm, func) in ([:logm,:log], )
611644
@eval begin
612645
function ($funm)(A::Symmetric{T}) where T<:Real
613646
F = eigfact(A)

base/linalg/triangular.jl

+10-10
Original file line numberDiff line numberDiff line change
@@ -1815,7 +1815,7 @@ function logm(A0::UpperTriangular{T}) where T<:Union{Float64,Complex{Float64}}
18151815
end
18161816
s0 = s
18171817
for k = 1:min(s, maxsqrt)
1818-
A = sqrtm(A)
1818+
A = sqrt(A)
18191819
end
18201820

18211821
AmI = A - I
@@ -1871,7 +1871,7 @@ function logm(A0::UpperTriangular{T}) where T<:Union{Float64,Complex{Float64}}
18711871
m = tmax
18721872
break
18731873
end
1874-
A = sqrtm(A)
1874+
A = sqrt(A)
18751875
AmI = A - I
18761876
s = s + 1
18771877
end
@@ -2015,7 +2015,7 @@ function invsquaring(A0::UpperTriangular, theta)
20152015
end
20162016
s0 = s
20172017
for k = 1:min(s, maxsqrt)
2018-
A = sqrtm(A)
2018+
A = sqrt(A)
20192019
end
20202020

20212021
AmI = A - I
@@ -2073,7 +2073,7 @@ function invsquaring(A0::UpperTriangular, theta)
20732073
m = tmax
20742074
break
20752075
end
2076-
A = sqrtm(A)
2076+
A = sqrt(A)
20772077
AmI = A - I
20782078
s = s + 1
20792079
end
@@ -2119,7 +2119,7 @@ unw(x::Number) = ceil((imag(x) - pi) / (2 * pi))
21192119

21202120
# End of auxiliary functions for logm and matrix power
21212121

2122-
function sqrtm(A::UpperTriangular)
2122+
function sqrt(A::UpperTriangular)
21232123
realmatrix = false
21242124
if isreal(A)
21252125
realmatrix = true
@@ -2131,9 +2131,9 @@ function sqrtm(A::UpperTriangular)
21312131
end
21322132
end
21332133
end
2134-
sqrtm(A,Val(realmatrix))
2134+
sqrt(A,Val(realmatrix))
21352135
end
2136-
function sqrtm(A::UpperTriangular{T},::Val{realmatrix}) where {T,realmatrix}
2136+
function sqrt(A::UpperTriangular{T},::Val{realmatrix}) where {T,realmatrix}
21372137
B = A.data
21382138
n = checksquare(B)
21392139
t = realmatrix ? typeof(sqrt(zero(T))) : typeof(sqrt(complex(zero(T))))
@@ -2151,7 +2151,7 @@ function sqrtm(A::UpperTriangular{T},::Val{realmatrix}) where {T,realmatrix}
21512151
end
21522152
return UpperTriangular(R)
21532153
end
2154-
function sqrtm(A::UnitUpperTriangular{T}) where T
2154+
function sqrt(A::UnitUpperTriangular{T}) where T
21552155
B = A.data
21562156
n = checksquare(B)
21572157
t = typeof(sqrt(zero(T)))
@@ -2169,8 +2169,8 @@ function sqrtm(A::UnitUpperTriangular{T}) where T
21692169
end
21702170
return UnitUpperTriangular(R)
21712171
end
2172-
sqrtm(A::LowerTriangular) = sqrtm(A.').'
2173-
sqrtm(A::UnitLowerTriangular) = sqrtm(A.').'
2172+
sqrt(A::LowerTriangular) = sqrt(A.').'
2173+
sqrt(A::UnitLowerTriangular) = sqrt(A.').'
21742174

21752175
# Generic eigensystems
21762176
eigvals(A::AbstractTriangular) = diag(A)

doc/src/manual/linear-algebra.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,8 @@ as well as whether hooks to various optimized methods for them in LAPACK are ava
177177

178178
| Matrix type | `+` | `-` | `*` | `\` | Other functions with optimized methods |
179179
|:------------------------- |:--- |:--- |:--- |:--- |:------------------------------------------------------------------- |
180-
| [`Symmetric`](@ref) | | | | MV | [`inv()`](@ref), [`sqrtm()`](@ref), [`exp()`](@ref) |
181-
| [`Hermitian`](@ref) | | | | MV | [`inv()`](@ref), [`sqrtm()`](@ref), [`exp()`](@ref) |
180+
| [`Symmetric`](@ref) | | | | MV | [`inv()`](@ref), [`sqrt()`](@ref), [`exp()`](@ref) |
181+
| [`Hermitian`](@ref) | | | | MV | [`inv()`](@ref), [`sqrt()`](@ref), [`exp()`](@ref) |
182182
| [`UpperTriangular`](@ref) | | | MV | MV | [`inv()`](@ref), [`det()`](@ref) |
183183
| [`LowerTriangular`](@ref) | | | MV | MV | [`inv()`](@ref), [`det()`](@ref) |
184184
| [`SymTridiagonal`](@ref) | M | M | MS | MV | [`eigmax()`](@ref), [`eigmin()`](@ref) |

doc/src/stdlib/linalg.md

-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ Base.kron
9393
Base.SparseArrays.blkdiag
9494
Base.LinAlg.linreg
9595
Base.LinAlg.logm
96-
Base.LinAlg.sqrtm
9796
Base.LinAlg.lyap
9897
Base.LinAlg.sylvester
9998
Base.LinAlg.issuccess

test/linalg/dense.jl

+11-11
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,10 @@ bimg = randn(n,2)/2
115115
end
116116

117117
@testset "Matrix square root" begin
118-
asq = sqrtm(a)
118+
asq = sqrt(a)
119119
@test asq*asq a
120120
asym = a'+a # symmetric indefinite
121-
asymsq = sqrtm(asym)
121+
asymsq = sqrt(asym)
122122
@test asymsq*asymsq asym
123123
end
124124

@@ -370,10 +370,10 @@ end
370370

371371
@testset "issue #2246" begin
372372
A = [1 2 0 0; 0 1 0 0; 0 0 0 0; 0 0 0 0]
373-
Asq = sqrtm(A)
373+
Asq = sqrt(A)
374374
@test Asq*Asq A
375375
A2 = view(A, 1:2, 1:2)
376-
A2sq = sqrtm(A2)
376+
A2sq = sqrt(A2)
377377
@test A2sq*A2sq A2
378378

379379
N = 3
@@ -569,12 +569,12 @@ end
569569
end
570570

571571
for A in (Aa, Ab, Ac, Ad, Ah, ADi)
572-
@test A^(1/2) sqrtm(A)
573-
@test A^(-1/2) inv(sqrtm(A))
574-
@test A^(3/4) sqrtm(A) * sqrtm(sqrtm(A))
575-
@test A^(-3/4) inv(A) * sqrtm(sqrtm(A))
576-
@test A^(17/8) A^2 * sqrtm(sqrtm(sqrtm(A)))
577-
@test A^(-17/8) inv(A^2 * sqrtm(sqrtm(sqrtm(A))))
572+
@test A^(1/2) sqrt(A)
573+
@test A^(-1/2) inv(sqrt(A))
574+
@test A^(3/4) sqrt(A) * sqrt(sqrt(A))
575+
@test A^(-3/4) inv(A) * sqrt(sqrt(A))
576+
@test A^(17/8) A^2 * sqrt(sqrt(sqrt(A)))
577+
@test A^(-17/8) inv(A^2 * sqrt(sqrt(sqrt(A))))
578578
@test (A^0.2)^5 A
579579
@test (A^(2/3))*(A^(1/3)) A
580580
@test (A^im)^(-im) A
@@ -676,7 +676,7 @@ end
676676
a = rand(elty)
677677
@test exp(a) == exp(a)
678678
@test isposdef(one(elty))
679-
@test sqrtm(a) == sqrt(a)
679+
@test sqrt(a) == sqrt(a)
680680
@test logm(a) log(a)
681681
@test lyap(one(elty),a) == -a/2
682682
end

test/linalg/diagonal.jl

+2-2
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ srand(1)
6666
@test logm(Diagonal(abs.(D.diag))) logm(abs.(DM)) atol=n^3*eps(relty)
6767
end
6868
if elty <: BlasComplex
69-
for func in (logdet, sqrtm)
69+
for func in (logdet, sqrt)
7070
@test func(D) func(DM) atol=n^2*eps(relty)*2
7171
end
7272
end
@@ -383,7 +383,7 @@ end
383383

384384
@test exp(D) == Diagonal([exp([1 2; 3 4]), exp([1 2; 3 4])])
385385
@test logm(D) == Diagonal([logm([1 2; 3 4]), logm([1 2; 3 4])])
386-
@test sqrtm(D) == Diagonal([sqrtm([1 2; 3 4]), sqrtm([1 2; 3 4])])
386+
@test sqrt(D) == Diagonal([sqrt([1 2; 3 4]), sqrt([1 2; 3 4])])
387387
end
388388

389389
@testset "multiplication with Symmetric/Hermitian" begin

test/linalg/triangular.jl

+6-6
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ for elty1 in (Float32, Float64, BigFloat, Complex64, Complex128, Complex{BigFloa
237237
@test ladb fladb atol=sqrt(eps(real(float(one(elty1)))))*n*n
238238

239239
# Matrix square root
240-
@test sqrtm(A1) |> t -> t*t A1
240+
@test sqrt(A1) |> t -> t*t A1
241241

242242
# naivesub errors
243243
@test_throws DimensionMismatch naivesub!(A1,ones(elty1,n+1))
@@ -391,10 +391,10 @@ end
391391
# Matrix square root
392392
Atn = UpperTriangular([-1 1 2; 0 -2 2; 0 0 -3])
393393
Atp = UpperTriangular([1 1 2; 0 2 2; 0 0 3])
394-
@test sqrtm(Atn) |> t->t*t Atn
395-
@test typeof(sqrtm(Atn)[1,1]) <: Complex
396-
@test sqrtm(Atp) |> t->t*t Atp
397-
@test typeof(sqrtm(Atp)[1,1]) <: Real
394+
@test sqrt(Atn) |> t->t*t Atn
395+
@test typeof(sqrt(Atn)[1,1]) <: Complex
396+
@test sqrt(Atp) |> t->t*t Atp
397+
@test typeof(sqrt(Atp)[1,1]) <: Real
398398

399399
Areal = randn(n, n)/2
400400
Aimg = randn(n, n)/2
@@ -511,5 +511,5 @@ end
511511
isdefined(Main, :TestHelpers) || @eval Main include("../TestHelpers.jl")
512512
using TestHelpers.Furlong
513513
let A = UpperTriangular([Furlong(1) Furlong(4); Furlong(0) Furlong(1)])
514-
@test sqrtm(A) == Furlong{1//2}.(UpperTriangular([1 2; 0 1]))
514+
@test sqrt(A) == Furlong{1//2}.(UpperTriangular([1 2; 0 1]))
515515
end

0 commit comments

Comments
 (0)