@@ -682,6 +682,22 @@ cis(A::AbstractMatrix{<:Base.HWNumber}) = exp_maybe_inplace(float.(im .* A))
682
682
exp_maybe_inplace (A:: StridedMatrix{<:Union{ComplexF32, ComplexF64}} ) = exp! (A)
683
683
exp_maybe_inplace (A) = exp (A)
684
684
685
+ function copytri_maybe_inplace (A:: StridedMatrix , uplo, conjugate:: Bool = false , diag:: Bool = false )
686
+ copytri! (A, uplo, conjugate, diag)
687
+ end
688
+ function copytri_maybe_inplace (A, uplo, conjugate:: Bool = false , diag:: Bool = false )
689
+ k = Int (diag)
690
+ if uplo == ' U'
691
+ B = triu (A, 1 - k)
692
+ triu (A, k) + (conjugate ? copy (adjoint (B)) : copy (transpose (B)))
693
+ elseif uplo == ' L'
694
+ B = tril (A, k- 1 )
695
+ tril (A, - k) + (conjugate ? copy (adjoint (B)) : copy (transpose (B)))
696
+ else
697
+ throw (ArgumentError (lazy " uplo argument must be 'U' (upper) or 'L' (lower), got $uplo" ))
698
+ end
699
+ end
700
+
685
701
"""
686
702
^(b::Number, A::AbstractMatrix)
687
703
@@ -894,7 +910,8 @@ function log(A::AbstractMatrix)
894
910
return applydiagonal (log, A)
895
911
elseif ishermitian (A)
896
912
logHermA = log (Hermitian (A))
897
- return ishermitian (logHermA) ? copytri! (parent (logHermA), ' U' , true ) : parent (logHermA)
913
+ PH = parent (logHermA)
914
+ return ishermitian (logHermA) ? copytri_maybe_inplace (PH, ' U' , true ) : PH
898
915
elseif istriu (A)
899
916
return triu! (parent (log (UpperTriangular (A))))
900
917
elseif isreal (A)
@@ -977,7 +994,8 @@ function sqrt(A::AbstractMatrix{T}) where {T<:Union{Real,Complex}}
977
994
return applydiagonal (sqrt, A)
978
995
elseif ishermitian (A)
979
996
sqrtHermA = sqrt (Hermitian (A))
980
- return ishermitian (sqrtHermA) ? copytri! (parent (sqrtHermA), ' U' , true ) : parent (sqrtHermA)
997
+ PS = parent (sqrtHermA)
998
+ return ishermitian (sqrtHermA) ? copytri_maybe_inplace (PS, ' U' , true ) : PS
981
999
elseif istriu (A)
982
1000
return triu! (parent (sqrt (UpperTriangular (A))))
983
1001
elseif isreal (A)
@@ -1100,7 +1118,8 @@ function cos(A::AbstractMatrix{<:Real})
1100
1118
if isdiag (A)
1101
1119
return applydiagonal (cos, A)
1102
1120
elseif issymmetric (A)
1103
- return copytri! (parent (cos (Symmetric (A))), ' U' )
1121
+ P = parent (cos (Symmetric (A)))
1122
+ return copytri_maybe_inplace (P, ' U' )
1104
1123
end
1105
1124
M = im .* float .(A)
1106
1125
return real (exp_maybe_inplace (M))
@@ -1109,7 +1128,8 @@ function cos(A::AbstractMatrix{<:Complex})
1109
1128
if isdiag (A)
1110
1129
return applydiagonal (cos, A)
1111
1130
elseif ishermitian (A)
1112
- return copytri! (parent (cos (Hermitian (A))), ' U' , true )
1131
+ P = parent (cos (Hermitian (A)))
1132
+ return copytri_maybe_inplace (P, ' U' , true )
1113
1133
end
1114
1134
M = im .* float .(A)
1115
1135
N = - M
@@ -1140,7 +1160,8 @@ function sin(A::AbstractMatrix{<:Real})
1140
1160
if isdiag (A)
1141
1161
return applydiagonal (sin, A)
1142
1162
elseif issymmetric (A)
1143
- return copytri! (parent (sin (Symmetric (A))), ' U' )
1163
+ P = parent (sin (Symmetric (A)))
1164
+ return copytri_maybe_inplace (P, ' U' )
1144
1165
end
1145
1166
M = im .* float .(A)
1146
1167
return imag (exp_maybe_inplace (M))
@@ -1149,7 +1170,8 @@ function sin(A::AbstractMatrix{<:Complex})
1149
1170
if isdiag (A)
1150
1171
return applydiagonal (sin, A)
1151
1172
elseif ishermitian (A)
1152
- return copytri! (parent (sin (Hermitian (A))), ' U' , true )
1173
+ P = parent (sin (Hermitian (A)))
1174
+ return copytri_maybe_inplace (P, ' U' , true )
1153
1175
end
1154
1176
M = im .* float .(A)
1155
1177
Mneg = - M
@@ -1183,8 +1205,10 @@ julia> C
1183
1205
function sincos (A:: AbstractMatrix{<:Real} )
1184
1206
if issymmetric (A)
1185
1207
symsinA, symcosA = sincos (Symmetric (A))
1186
- sinA = copytri! (parent (symsinA), ' U' )
1187
- cosA = copytri! (parent (symcosA), ' U' )
1208
+ Psin = parent (symsinA)
1209
+ Pcos = parent (symcosA)
1210
+ sinA = copytri_maybe_inplace (Psin, ' U' )
1211
+ cosA = copytri_maybe_inplace (Pcos, ' U' )
1188
1212
return sinA, cosA
1189
1213
end
1190
1214
M = im .* float .(A)
@@ -1194,8 +1218,10 @@ end
1194
1218
function sincos (A:: AbstractMatrix{<:Complex} )
1195
1219
if ishermitian (A)
1196
1220
hermsinA, hermcosA = sincos (Hermitian (A))
1197
- sinA = copytri! (parent (hermsinA), ' U' , true )
1198
- cosA = copytri! (parent (hermcosA), ' U' , true )
1221
+ Psin = parent (hermsinA)
1222
+ Pcos = parent (hermcosA)
1223
+ sinA = copytri_maybe_inplace (Psin, ' U' , true )
1224
+ cosA = copytri_maybe_inplace (Pcos, ' U' , true )
1199
1225
return sinA, cosA
1200
1226
end
1201
1227
M = im .* float .(A)
@@ -1239,7 +1265,8 @@ function tan(A::AbstractMatrix)
1239
1265
if isdiag (A)
1240
1266
return applydiagonal (tan, A)
1241
1267
elseif ishermitian (A)
1242
- return copytri! (parent (tan (Hermitian (A))), ' U' , true )
1268
+ P = parent (tan (Hermitian (A)))
1269
+ return copytri_maybe_inplace (P, ' U' , true )
1243
1270
end
1244
1271
S, C = sincos (A)
1245
1272
S /= C
@@ -1255,7 +1282,8 @@ function cosh(A::AbstractMatrix)
1255
1282
if isdiag (A)
1256
1283
return applydiagonal (cosh, A)
1257
1284
elseif ishermitian (A)
1258
- return copytri! (parent (cosh (Hermitian (A))), ' U' , true )
1285
+ P = parent (cosh (Hermitian (A)))
1286
+ return copytri_maybe_inplace (P, ' U' , true )
1259
1287
end
1260
1288
X = exp (A)
1261
1289
negA = @. float (- A)
@@ -1272,7 +1300,8 @@ function sinh(A::AbstractMatrix)
1272
1300
if isdiag (A)
1273
1301
return applydiagonal (sinh, A)
1274
1302
elseif ishermitian (A)
1275
- return copytri! (parent (sinh (Hermitian (A))), ' U' , true )
1303
+ P = parent (sinh (Hermitian (A)))
1304
+ return copytri_maybe_inplace (P, ' U' , true )
1276
1305
end
1277
1306
X = exp (A)
1278
1307
negA = @. float (- A)
@@ -1289,7 +1318,8 @@ function tanh(A::AbstractMatrix)
1289
1318
if isdiag (A)
1290
1319
return applydiagonal (tanh, A)
1291
1320
elseif ishermitian (A)
1292
- return copytri! (parent (tanh (Hermitian (A))), ' U' , true )
1321
+ P = parent (tanh (Hermitian (A)))
1322
+ return copytri_maybe_inplace (P, ' U' , true )
1293
1323
end
1294
1324
X = exp (A)
1295
1325
negA = @. float (- A)
@@ -1332,7 +1362,8 @@ function acos(A::AbstractMatrix)
1332
1362
return applydiagonal (acos, A)
1333
1363
elseif ishermitian (A)
1334
1364
acosHermA = acos (Hermitian (A))
1335
- return isa (acosHermA, Hermitian) ? copytri! (parent (acosHermA), ' U' , true ) : parent (acosHermA)
1365
+ P = parent (acosHermA)
1366
+ return isa (acosHermA, Hermitian) ? copytri_maybe_inplace (P, ' U' , true ) : P
1336
1367
end
1337
1368
SchurF = Schur {Complex} (schur (A))
1338
1369
U = UpperTriangular (SchurF. T)
@@ -1365,7 +1396,8 @@ function asin(A::AbstractMatrix)
1365
1396
return applydiagonal (asin, A)
1366
1397
elseif ishermitian (A)
1367
1398
asinHermA = asin (Hermitian (A))
1368
- return isa (asinHermA, Hermitian) ? copytri! (parent (asinHermA), ' U' , true ) : parent (asinHermA)
1399
+ P = parent (asinHermA)
1400
+ return isa (asinHermA, Hermitian) ? copytri_maybe_inplace (P, ' U' , true ) : P
1369
1401
end
1370
1402
SchurF = Schur {Complex} (schur (A))
1371
1403
U = UpperTriangular (SchurF. T)
@@ -1397,7 +1429,8 @@ function atan(A::AbstractMatrix)
1397
1429
if isdiag (A)
1398
1430
return applydiagonal (atan, A)
1399
1431
elseif ishermitian (A)
1400
- return copytri! (parent (atan (Hermitian (A))), ' U' , true )
1432
+ P = parent (atan (Hermitian (A)))
1433
+ return copytri_maybe_inplace (P, ' U' , true )
1401
1434
end
1402
1435
SchurF = Schur {Complex} (schur (A))
1403
1436
U = im * UpperTriangular (SchurF. T)
@@ -1418,7 +1451,8 @@ function acosh(A::AbstractMatrix)
1418
1451
return applydiagonal (acosh, A)
1419
1452
elseif ishermitian (A)
1420
1453
acoshHermA = acosh (Hermitian (A))
1421
- return isa (acoshHermA, Hermitian) ? copytri! (parent (acoshHermA), ' U' , true ) : parent (acoshHermA)
1454
+ P = parent (acoshHermA)
1455
+ return isa (acoshHermA, Hermitian) ? copytri_maybe_inplace (P, ' U' , true ) : P
1422
1456
end
1423
1457
SchurF = Schur {Complex} (schur (A))
1424
1458
U = UpperTriangular (SchurF. T)
@@ -1438,7 +1472,8 @@ function asinh(A::AbstractMatrix)
1438
1472
if isdiag (A)
1439
1473
return applydiagonal (asinh, A)
1440
1474
elseif ishermitian (A)
1441
- return copytri! (parent (asinh (Hermitian (A))), ' U' , true )
1475
+ P = parent (asinh (Hermitian (A)))
1476
+ return copytri_maybe_inplace (P, ' U' , true )
1442
1477
end
1443
1478
SchurF = Schur {Complex} (schur (A))
1444
1479
U = UpperTriangular (SchurF. T)
@@ -1458,7 +1493,8 @@ function atanh(A::AbstractMatrix)
1458
1493
if isdiag (A)
1459
1494
return applydiagonal (atanh, A)
1460
1495
elseif ishermitian (A)
1461
- return copytri! (parent (atanh (Hermitian (A))), ' U' , true )
1496
+ P = parent (atanh (Hermitian (A)))
1497
+ return copytri_maybe_inplace (P, ' U' , true )
1462
1498
end
1463
1499
SchurF = Schur {Complex} (schur (A))
1464
1500
U = UpperTriangular (SchurF. T)
0 commit comments