@@ -1672,7 +1672,7 @@ powm(A::LowerTriangular, p::Real) = powm(A.', p::Real).'
1672
1672
# Based on the code available at http://eprints.ma.man.ac.uk/1851/02/logm.zip,
1673
1673
# Copyright (c) 2011, Awad H. Al-Mohy and Nicholas J. Higham
1674
1674
# Julia version relicensed with permission from original authors
1675
- function logm {T<:Union{Float32, Float64,Complex{Float32} ,Complex{Float64}}} (A0:: UpperTriangular{T} )
1675
+ function logm {T<:Union{Float64,Complex{Float64}}} (A0:: UpperTriangular{T} )
1676
1676
theta = [1.586970738772063e-005 ,
1677
1677
2.313807884242979e-003 ,
1678
1678
1.938179313533253e-002 ,
@@ -1718,7 +1718,7 @@ function logm{T<:Union{Float32,Float64,Complex{Float32},Complex{Float64}}}(A0::U
1718
1718
scale! (2 ^ s,Y. data)
1719
1719
1720
1720
# Compute accurate diagonal and superdiagonal of log(A)
1721
- for k = 1 : n- 1
1721
+ @inbounds for k = 1 : n- 1
1722
1722
Ak = complex (A0[k,k])
1723
1723
Akp1 = complex (A0[k+ 1 ,k+ 1 ])
1724
1724
logAk = log (Ak)
@@ -1749,7 +1749,7 @@ logm(A::LowerTriangular) = logm(A.').'
1749
1749
# Numer. Algorithms, 59, (2012), 393–402.
1750
1750
function sqrt_diag! (A0:: UpperTriangular , A:: UpperTriangular , s)
1751
1751
n = checksquare (A0)
1752
- for i = 1 : n
1752
+ @inbounds for i = 1 : n
1753
1753
a = complex (A0[i,i])
1754
1754
if s == 0
1755
1755
A[i,i] = a - 1
@@ -1806,60 +1806,53 @@ function invsquaring(A0::UpperTriangular, theta)
1806
1806
d2 = sqrt (norm (AmI^ 2 , 1 ))
1807
1807
d3 = cbrt (norm (AmI^ 3 , 1 ))
1808
1808
alpha2 = max (d2, d3)
1809
- foundm = false
1810
1809
if alpha2 <= theta[2 ]
1811
1810
m = alpha2<= theta[1 ]?1 : 2
1812
- foundm = true
1813
- end
1814
-
1815
- while ~ foundm
1816
- more = false
1817
- if s > s0
1818
- d3 = cbrt (norm (AmI^ 3 , 1 ))
1819
- end
1820
- d4 = norm (AmI^ 4 , 1 )^ (1 / 4 )
1821
- alpha3 = max (d3, d4)
1822
- if alpha3 <= theta[tmax]
1823
- for j = 3 : tmax
1824
- if alpha3 <= theta[j]
1811
+ else
1812
+ while true
1813
+ more = false
1814
+ if s > s0
1815
+ d3 = cbrt (norm (AmI^ 3 , 1 ))
1816
+ end
1817
+ d4 = norm (AmI^ 4 , 1 )^ (1 / 4 )
1818
+ alpha3 = max (d3, d4)
1819
+ if alpha3 <= theta[tmax]
1820
+ for j = 3 : tmax
1821
+ if alpha3 <= theta[j]
1822
+ break
1823
+ end
1824
+ end
1825
+ if j <= 6
1826
+ m = j
1825
1827
break
1828
+ elseif alpha3 / 2 <= theta[5 ] && p < 2
1829
+ more = true
1830
+ p = p + 1
1826
1831
end
1827
1832
end
1828
- if j <= 6
1829
- m = j
1830
- foundm = true
1831
- break
1832
- elseif alpha3 / 2 <= theta[5 ] && p < 2
1833
- more = true
1834
- p = p + 1
1835
- end
1836
- end
1837
-
1838
- if ~ more
1839
- d5 = norm (AmI^ 5 , 1 )^ (1 / 5 )
1840
- alpha4 = max (d4, d5)
1841
- eta = min (alpha3, alpha4)
1842
- if eta <= theta[tmax]
1843
- j = 0
1844
- for j = 6 : tmax
1845
- if eta <= theta[j]
1846
- m = j
1847
- break
1833
+ if ~ more
1834
+ d5 = norm (AmI^ 5 , 1 )^ (1 / 5 )
1835
+ alpha4 = max (d4, d5)
1836
+ eta = min (alpha3, alpha4)
1837
+ if eta <= theta[tmax]
1838
+ j = 0
1839
+ for j = 6 : tmax
1840
+ if eta <= theta[j]
1841
+ m = j
1842
+ break
1843
+ end
1848
1844
end
1845
+ break
1849
1846
end
1850
- foundm = true
1847
+ end
1848
+ if s == maxsqrt
1849
+ m = tmax
1851
1850
break
1852
1851
end
1852
+ A = sqrtm (A)
1853
+ AmI = A - I
1854
+ s = s + 1
1853
1855
end
1854
-
1855
- if s == maxsqrt
1856
- m = tmax
1857
- foundm = true
1858
- break
1859
- end
1860
- A = sqrtm (A)
1861
- AmI = A - I
1862
- s = s + 1
1863
1856
end
1864
1857
1865
1858
# Compute accurate superdiagonal of T
0 commit comments