@@ -683,7 +683,12 @@ Base.:^(::Irrational{:ℯ}, A::AbstractMatrix) = exp(A)
683
683
# # "Functions of Matrices: Theory and Computation", SIAM
684
684
function exp! (A:: StridedMatrix{T} ) where T<: BlasFloat
685
685
n = checksquare (A)
686
- if ishermitian (A)
686
+ if isdiag (A)
687
+ for i in diagind (A, IndexStyle (A))
688
+ A[i] = exp (A[i])
689
+ end
690
+ return A
691
+ elseif ishermitian (A)
687
692
return copytri! (parent (exp (Hermitian (A))), ' U' , true )
688
693
end
689
694
ilo, ihi, scale = LAPACK. gebal! (' B' , A) # modifies A
@@ -1014,9 +1019,16 @@ end
1014
1019
cbrt (A:: AdjointAbsMat ) = adjoint (cbrt (parent (A)))
1015
1020
cbrt (A:: TransposeAbsMat ) = transpose (cbrt (parent (A)))
1016
1021
1022
+ function applydiagonal (f, A)
1023
+ dinv = f (Diagonal (A))
1024
+ copyto! (similar (A, eltype (dinv)), dinv)
1025
+ end
1026
+
1017
1027
function inv (A:: StridedMatrix{T} ) where T
1018
1028
checksquare (A)
1019
- if istriu (A)
1029
+ if isdiag (A)
1030
+ Ai = applydiagonal (inv, A)
1031
+ elseif istriu (A)
1020
1032
Ai = triu! (parent (inv (UpperTriangular (A))))
1021
1033
elseif istril (A)
1022
1034
Ai = tril! (parent (inv (LowerTriangular (A))))
@@ -1044,14 +1056,18 @@ julia> cos(fill(1.0, (2,2)))
1044
1056
```
1045
1057
"""
1046
1058
function cos (A:: AbstractMatrix{<:Real} )
1047
- if issymmetric (A)
1059
+ if isdiag (A)
1060
+ return applydiagonal (cos, A)
1061
+ elseif issymmetric (A)
1048
1062
return copytri! (parent (cos (Symmetric (A))), ' U' )
1049
1063
end
1050
1064
T = complex (float (eltype (A)))
1051
1065
return real (exp! (T .(im .* A)))
1052
1066
end
1053
1067
function cos (A:: AbstractMatrix{<:Complex} )
1054
- if ishermitian (A)
1068
+ if isdiag (A)
1069
+ return applydiagonal (cos, A)
1070
+ elseif ishermitian (A)
1055
1071
return copytri! (parent (cos (Hermitian (A))), ' U' , true )
1056
1072
end
1057
1073
T = complex (float (eltype (A)))
@@ -1077,14 +1093,18 @@ julia> sin(fill(1.0, (2,2)))
1077
1093
```
1078
1094
"""
1079
1095
function sin (A:: AbstractMatrix{<:Real} )
1080
- if issymmetric (A)
1096
+ if isdiag (A)
1097
+ return applydiagonal (sin, A)
1098
+ elseif issymmetric (A)
1081
1099
return copytri! (parent (sin (Symmetric (A))), ' U' )
1082
1100
end
1083
1101
T = complex (float (eltype (A)))
1084
1102
return imag (exp! (T .(im .* A)))
1085
1103
end
1086
1104
function sin (A:: AbstractMatrix{<:Complex} )
1087
- if ishermitian (A)
1105
+ if isdiag (A)
1106
+ return applydiagonal (sin, A)
1107
+ elseif ishermitian (A)
1088
1108
return copytri! (parent (sin (Hermitian (A))), ' U' , true )
1089
1109
end
1090
1110
T = complex (float (eltype (A)))
@@ -1163,7 +1183,9 @@ julia> tan(fill(1.0, (2,2)))
1163
1183
```
1164
1184
"""
1165
1185
function tan (A:: AbstractMatrix )
1166
- if ishermitian (A)
1186
+ if isdiag (A)
1187
+ return applydiagonal (tan, A)
1188
+ elseif ishermitian (A)
1167
1189
return copytri! (parent (tan (Hermitian (A))), ' U' , true )
1168
1190
end
1169
1191
S, C = sincos (A)
@@ -1177,7 +1199,9 @@ end
1177
1199
Compute the matrix hyperbolic cosine of a square matrix `A`.
1178
1200
"""
1179
1201
function cosh (A:: AbstractMatrix )
1180
- if ishermitian (A)
1202
+ if isdiag (A)
1203
+ return applydiagonal (cosh, A)
1204
+ elseif ishermitian (A)
1181
1205
return copytri! (parent (cosh (Hermitian (A))), ' U' , true )
1182
1206
end
1183
1207
X = exp (A)
@@ -1191,7 +1215,9 @@ end
1191
1215
Compute the matrix hyperbolic sine of a square matrix `A`.
1192
1216
"""
1193
1217
function sinh (A:: AbstractMatrix )
1194
- if ishermitian (A)
1218
+ if isdiag (A)
1219
+ return applydiagonal (sinh, A)
1220
+ elseif ishermitian (A)
1195
1221
return copytri! (parent (sinh (Hermitian (A))), ' U' , true )
1196
1222
end
1197
1223
X = exp (A)
@@ -1205,7 +1231,9 @@ end
1205
1231
Compute the matrix hyperbolic tangent of a square matrix `A`.
1206
1232
"""
1207
1233
function tanh (A:: AbstractMatrix )
1208
- if ishermitian (A)
1234
+ if isdiag (A)
1235
+ return applydiagonal (tanh, A)
1236
+ elseif ishermitian (A)
1209
1237
return copytri! (parent (tanh (Hermitian (A))), ' U' , true )
1210
1238
end
1211
1239
X = exp (A)
@@ -1240,7 +1268,9 @@ julia> acos(cos([0.5 0.1; -0.2 0.3]))
1240
1268
```
1241
1269
"""
1242
1270
function acos (A:: AbstractMatrix )
1243
- if ishermitian (A)
1271
+ if isdiag (A)
1272
+ return applydiagonal (acos, A)
1273
+ elseif ishermitian (A)
1244
1274
acosHermA = acos (Hermitian (A))
1245
1275
return isa (acosHermA, Hermitian) ? copytri! (parent (acosHermA), ' U' , true ) : parent (acosHermA)
1246
1276
end
@@ -1271,7 +1301,9 @@ julia> asin(sin([0.5 0.1; -0.2 0.3]))
1271
1301
```
1272
1302
"""
1273
1303
function asin (A:: AbstractMatrix )
1274
- if ishermitian (A)
1304
+ if isdiag (A)
1305
+ return applydiagonal (asin, A)
1306
+ elseif ishermitian (A)
1275
1307
asinHermA = asin (Hermitian (A))
1276
1308
return isa (asinHermA, Hermitian) ? copytri! (parent (asinHermA), ' U' , true ) : parent (asinHermA)
1277
1309
end
@@ -1302,7 +1334,9 @@ julia> atan(tan([0.5 0.1; -0.2 0.3]))
1302
1334
```
1303
1335
"""
1304
1336
function atan (A:: AbstractMatrix )
1305
- if ishermitian (A)
1337
+ if isdiag (A)
1338
+ return applydiagonal (atan, A)
1339
+ elseif ishermitian (A)
1306
1340
return copytri! (parent (atan (Hermitian (A))), ' U' , true )
1307
1341
end
1308
1342
SchurF = Schur {Complex} (schur (A))
@@ -1320,7 +1354,9 @@ logarithmic formulas used to compute this function, see [^AH16_4].
1320
1354
[^AH16_4]: Mary Aprahamian and Nicholas J. Higham, "Matrix Inverse Trigonometric and Inverse Hyperbolic Functions: Theory and Algorithms", MIMS EPrint: 2016.4. [https://doi.org/10.1137/16M1057577](https://doi.org/10.1137/16M1057577)
1321
1355
"""
1322
1356
function acosh (A:: AbstractMatrix )
1323
- if ishermitian (A)
1357
+ if isdiag (A)
1358
+ return applydiagonal (acosh, A)
1359
+ elseif ishermitian (A)
1324
1360
acoshHermA = acosh (Hermitian (A))
1325
1361
return isa (acoshHermA, Hermitian) ? copytri! (parent (acoshHermA), ' U' , true ) : parent (acoshHermA)
1326
1362
end
@@ -1339,7 +1375,9 @@ logarithmic formulas used to compute this function, see [^AH16_5].
1339
1375
[^AH16_5]: Mary Aprahamian and Nicholas J. Higham, "Matrix Inverse Trigonometric and Inverse Hyperbolic Functions: Theory and Algorithms", MIMS EPrint: 2016.4. [https://doi.org/10.1137/16M1057577](https://doi.org/10.1137/16M1057577)
1340
1376
"""
1341
1377
function asinh (A:: AbstractMatrix )
1342
- if ishermitian (A)
1378
+ if isdiag (A)
1379
+ return applydiagonal (asinh, A)
1380
+ elseif ishermitian (A)
1343
1381
return copytri! (parent (asinh (Hermitian (A))), ' U' , true )
1344
1382
end
1345
1383
SchurF = Schur {Complex} (schur (A))
@@ -1357,7 +1395,9 @@ logarithmic formulas used to compute this function, see [^AH16_6].
1357
1395
[^AH16_6]: Mary Aprahamian and Nicholas J. Higham, "Matrix Inverse Trigonometric and Inverse Hyperbolic Functions: Theory and Algorithms", MIMS EPrint: 2016.4. [https://doi.org/10.1137/16M1057577](https://doi.org/10.1137/16M1057577)
1358
1396
"""
1359
1397
function atanh (A:: AbstractMatrix )
1360
- if ishermitian (A)
1398
+ if isdiag (A)
1399
+ return applydiagonal (atanh, A)
1400
+ elseif ishermitian (A)
1361
1401
return copytri! (parent (atanh (Hermitian (A))), ' U' , true )
1362
1402
end
1363
1403
SchurF = Schur {Complex} (schur (A))
0 commit comments