@@ -997,6 +997,12 @@ function ^(A::UpperTriangular, p::Real)
997
997
return powm (A,p - ceil (p)) * A^ ceil (p)
998
998
end
999
999
end
1000
+ # Complex matrix power for upper triangular factor, see:
1001
+ # Higham and Lin, "A Schur-Padé algorithm for fractional powers of a Matrix",
1002
+ # SIAM J. Matrix Anal. & Appl., 32 (3), (2011) 1056–1078.
1003
+ # Higham and Lin, "An improved Schur-Padé algorithm for fractional powers of
1004
+ # a matrix and their Fréchet derivatives", SIAM. J. Matrix Anal. & Appl.,
1005
+ # 34(3), (2013) 1341–1360.
1000
1006
function powm {T<:Union{Float64,Complex{Float64}}} (A0:: UpperTriangular{T} , p:: Real )
1001
1007
1002
1008
if abs (p) >= 1
@@ -1153,6 +1159,8 @@ end
1153
1159
logm (A:: LowerTriangular ) = logm (A.' ).'
1154
1160
1155
1161
# Auxiliary functions for logm and matrix power
1162
+
1163
+ # Compute accurate diagonal of A = A0^s - I
1156
1164
function sqrt_diag! (A0:: UpperTriangular , A:: UpperTriangular , s)
1157
1165
n = chksquare (A0)
1158
1166
for i = 1 : n
@@ -1177,6 +1185,7 @@ function sqrt_diag!(A0::UpperTriangular, A::UpperTriangular, s)
1177
1185
end
1178
1186
end
1179
1187
1188
+ # Compute the repeated square root of A to match the conditions on theta
1180
1189
function invsquaring {T} (A0:: UpperTriangular{T} , theta)
1181
1190
maxsqrt = 100
1182
1191
tmax = size (theta, 1 )
@@ -1274,6 +1283,7 @@ function invsquaring{T}(A0::UpperTriangular{T}, theta)
1274
1283
1275
1284
end
1276
1285
1286
+ # Compute accurate diagonal and superdiagonal of A = A0^p
1277
1287
function blockpower! (A0:: UpperTriangular , A:: UpperTriangular , p)
1278
1288
n = chksquare (A0)
1279
1289
for k = 1 : n- 1
@@ -1300,6 +1310,8 @@ function blockpower!(A0::UpperTriangular, A::UpperTriangular, p)
1300
1310
end
1301
1311
end
1302
1312
end
1313
+
1314
+ # Unwinding number
1303
1315
unw (x:: Real ) = 0
1304
1316
unw (x:: Number ) = ceil ((imag (x) - pi ) / (2 * pi ))
1305
1317
0 commit comments