@@ -206,15 +206,15 @@ for (S, H) in ((:Symmetric, :Hermitian), (:Hermitian, :Symmetric))
206
206
throw (ArgumentError (" Cannot construct $($ S) ; uplo doesn't match" ))
207
207
end
208
208
end
209
- $ S (A:: $H ) = $ S (A, sym_uplo (A. uplo))
209
+ $ S (A:: $H ) = $ S (A, _sym_uplo (A. uplo))
210
210
function $S (A:: $H , uplo:: Symbol )
211
211
if A. uplo == char_uplo (uplo)
212
212
if $ H === Hermitian && ! (eltype (A) <: Real ) &&
213
213
any (! isreal, A. data[i] for i in diagind (A. data, IndexStyle (A. data)))
214
214
215
215
throw (ArgumentError (" Cannot construct $($ S) ($($ H) )); diagonal contains complex values" ))
216
216
end
217
- return $ S (A. data, sym_uplo (A. uplo))
217
+ return $ S (A. data, _sym_uplo (A. uplo))
218
218
else
219
219
throw (ArgumentError (" Cannot construct $($ S) ; uplo doesn't match" ))
220
220
end
286
286
@inline function getindex (A:: Symmetric , i:: Int , j:: Int )
287
287
@boundscheck checkbounds (A, i, j)
288
288
@inbounds if i == j
289
- return symmetric (A. data[i, j], sym_uplo (A. uplo)):: symmetric_type (eltype (A. data))
289
+ return symmetric (A. data[i, j], _sym_uplo (A. uplo)):: symmetric_type (eltype (A. data))
290
290
elseif (A. uplo == ' U' ) == (i < j)
291
291
return A. data[i, j]
292
292
else
296
296
@inline function getindex (A:: Hermitian , i:: Int , j:: Int )
297
297
@boundscheck checkbounds (A, i, j)
298
298
@inbounds if i == j
299
- return hermitian (A. data[i, j], sym_uplo (A. uplo)):: hermitian_type (eltype (A. data))
299
+ return hermitian (A. data[i, j], _sym_uplo (A. uplo)):: hermitian_type (eltype (A. data))
300
300
elseif (A. uplo == ' U' ) == (i < j)
301
301
return A. data[i, j]
302
302
else
@@ -329,14 +329,14 @@ Base._reverse(A::Hermitian, ::Colon) = Hermitian(reverse(A.data), A.uplo == 'U'
329
329
end
330
330
331
331
Base. dataids (A:: HermOrSym ) = Base. dataids (parent (A))
332
- Base. unaliascopy (A:: Hermitian ) = Hermitian (Base. unaliascopy (parent (A)), sym_uplo (A. uplo))
333
- Base. unaliascopy (A:: Symmetric ) = Symmetric (Base. unaliascopy (parent (A)), sym_uplo (A. uplo))
332
+ Base. unaliascopy (A:: Hermitian ) = Hermitian (Base. unaliascopy (parent (A)), _sym_uplo (A. uplo))
333
+ Base. unaliascopy (A:: Symmetric ) = Symmetric (Base. unaliascopy (parent (A)), _sym_uplo (A. uplo))
334
334
335
335
_conjugation (:: Union{Symmetric, Hermitian{<:Real}} ) = transpose
336
336
_conjugation (:: Hermitian ) = adjoint
337
337
338
- diag (A:: Symmetric ) = symmetric .(diag (parent (A)), sym_uplo (A. uplo))
339
- diag (A:: Hermitian ) = hermitian .(diag (parent (A)), sym_uplo (A. uplo))
338
+ diag (A:: Symmetric ) = symmetric .(diag (parent (A)), _sym_uplo (A. uplo))
339
+ diag (A:: Hermitian ) = hermitian .(diag (parent (A)), _sym_uplo (A. uplo))
340
340
341
341
function applytri (f, A:: HermOrSym )
342
342
if A. uplo == ' U'
@@ -374,15 +374,15 @@ similar(A::Union{Symmetric,Hermitian}, ::Type{T}, dims::Dims{N}) where {T,N} = s
374
374
parent (A:: HermOrSym ) = A. data
375
375
Symmetric {T,S} (A:: Symmetric{T,S} ) where {T,S<: AbstractMatrix{T} } = A
376
376
Symmetric {T,S} (A:: Symmetric ) where {T,S<: AbstractMatrix{T} } = Symmetric {T,S} (convert (S,A. data),A. uplo)
377
- AbstractMatrix {T} (A:: Symmetric ) where {T} = Symmetric (convert (AbstractMatrix{T}, A. data), sym_uplo (A. uplo))
377
+ AbstractMatrix {T} (A:: Symmetric ) where {T} = Symmetric (convert (AbstractMatrix{T}, A. data), _sym_uplo (A. uplo))
378
378
AbstractMatrix {T} (A:: Symmetric{T} ) where {T} = copy (A)
379
379
Hermitian {T,S} (A:: Hermitian{T,S} ) where {T,S<: AbstractMatrix{T} } = A
380
380
Hermitian {T,S} (A:: Hermitian ) where {T,S<: AbstractMatrix{T} } = Hermitian {T,S} (convert (S,A. data),A. uplo)
381
- AbstractMatrix {T} (A:: Hermitian ) where {T} = Hermitian (convert (AbstractMatrix{T}, A. data), sym_uplo (A. uplo))
381
+ AbstractMatrix {T} (A:: Hermitian ) where {T} = Hermitian (convert (AbstractMatrix{T}, A. data), _sym_uplo (A. uplo))
382
382
AbstractMatrix {T} (A:: Hermitian{T} ) where {T} = copy (A)
383
383
384
- copy (A:: Symmetric ) = (Symmetric (parentof_applytri (copy, A), sym_uplo (A. uplo)))
385
- copy (A:: Hermitian ) = (Hermitian (parentof_applytri (copy, A), sym_uplo (A. uplo)))
384
+ copy (A:: Symmetric ) = (Symmetric (parentof_applytri (copy, A), _sym_uplo (A. uplo)))
385
+ copy (A:: Hermitian ) = (Hermitian (parentof_applytri (copy, A), _sym_uplo (A. uplo)))
386
386
387
387
function copyto! (dest:: Symmetric , src:: Symmetric )
388
388
if axes (dest) != axes (src)
@@ -423,13 +423,13 @@ end
423
423
end
424
424
@inline function _symmetrize_diagonal! (B, A:: Symmetric )
425
425
for i = 1 : size (A, 1 )
426
- B[i,i] = symmetric (A[i,i], sym_uplo (A. uplo)):: symmetric_type (eltype (A. data))
426
+ B[i,i] = symmetric (A[i,i], _sym_uplo (A. uplo)):: symmetric_type (eltype (A. data))
427
427
end
428
428
return B
429
429
end
430
430
@inline function _symmetrize_diagonal! (B, A:: Hermitian )
431
431
for i = 1 : size (A, 1 )
432
- B[i,i] = hermitian (A[i,i], sym_uplo (A. uplo)):: hermitian_type (eltype (A. data))
432
+ B[i,i] = hermitian (A[i,i], _sym_uplo (A. uplo)):: hermitian_type (eltype (A. data))
433
433
end
434
434
return B
435
435
end
@@ -501,9 +501,9 @@ transpose(A::Hermitian{<:Real}) = A
501
501
502
502
real (A:: Symmetric{<:Real} ) = A
503
503
real (A:: Hermitian{<:Real} ) = A
504
- real (A:: Symmetric ) = Symmetric (parentof_applytri (real, A), sym_uplo (A. uplo))
505
- real (A:: Hermitian ) = Hermitian (parentof_applytri (real, A), sym_uplo (A. uplo))
506
- imag (A:: Symmetric ) = Symmetric (parentof_applytri (imag, A), sym_uplo (A. uplo))
504
+ real (A:: Symmetric ) = Symmetric (parentof_applytri (real, A), _sym_uplo (A. uplo))
505
+ real (A:: Hermitian ) = Hermitian (parentof_applytri (real, A), _sym_uplo (A. uplo))
506
+ imag (A:: Symmetric ) = Symmetric (parentof_applytri (imag, A), _sym_uplo (A. uplo))
507
507
508
508
Base. copy (A:: Adjoint{<:Any,<:Symmetric} ) =
509
509
Symmetric (copy (adjoint (A. parent. data)), ifelse (A. parent. uplo == ' U' , :L , :U ))
@@ -513,8 +513,8 @@ Base.copy(A::Transpose{<:Any,<:Hermitian}) =
513
513
tr (A:: Symmetric{<:Number} ) = tr (A. data) # to avoid AbstractMatrix fallback (incl. allocations)
514
514
tr (A:: Hermitian{<:Number} ) = real (tr (A. data))
515
515
516
- Base. conj (A:: Symmetric ) = Symmetric (parentof_applytri (conj, A), sym_uplo (A. uplo))
517
- Base. conj (A:: Hermitian ) = Hermitian (parentof_applytri (conj, A), sym_uplo (A. uplo))
516
+ Base. conj (A:: Symmetric ) = Symmetric (parentof_applytri (conj, A), _sym_uplo (A. uplo))
517
+ Base. conj (A:: Hermitian ) = Hermitian (parentof_applytri (conj, A), _sym_uplo (A. uplo))
518
518
Base. conj! (A:: HermOrSym ) = typeof (A)(parentof_applytri (conj!, A), A. uplo)
519
519
520
520
# tril/triu
@@ -731,25 +731,25 @@ function _hermkron!(C, A, B, conj, real, Auplo, Buplo)
731
731
end
732
732
end
733
733
734
- (- )(A:: Symmetric ) = Symmetric (parentof_applytri (- , A), sym_uplo (A. uplo))
735
- (- )(A:: Hermitian ) = Hermitian (parentof_applytri (- , A), sym_uplo (A. uplo))
734
+ (- )(A:: Symmetric ) = Symmetric (parentof_applytri (- , A), _sym_uplo (A. uplo))
735
+ (- )(A:: Hermitian ) = Hermitian (parentof_applytri (- , A), _sym_uplo (A. uplo))
736
736
737
737
# # Addition/subtraction
738
738
for f ∈ (:+ , :- ), Wrapper ∈ (:Hermitian , :Symmetric )
739
739
@eval function $f (A:: $Wrapper , B:: $Wrapper )
740
- uplo = A. uplo == B. uplo ? sym_uplo (A. uplo) : (:U )
740
+ uplo = A. uplo == B. uplo ? _sym_uplo (A. uplo) : (:U )
741
741
$ Wrapper (parentof_applytri ($ f, A, B), uplo)
742
742
end
743
743
end
744
744
745
745
for f in (:+ , :- )
746
746
@eval begin
747
- $ f (A:: Hermitian , B:: Symmetric{<:Real} ) = $ f (A, Hermitian (parent (B), sym_uplo (B. uplo)))
748
- $ f (A:: Symmetric{<:Real} , B:: Hermitian ) = $ f (Hermitian (parent (A), sym_uplo (A. uplo)), B)
749
- $ f (A:: SymTridiagonal , B:: Symmetric ) = $ f (Symmetric (A, sym_uplo (B. uplo)), B)
750
- $ f (A:: Symmetric , B:: SymTridiagonal ) = $ f (A, Symmetric (B, sym_uplo (A. uplo)))
751
- $ f (A:: SymTridiagonal{<:Real} , B:: Hermitian ) = $ f (Hermitian (A, sym_uplo (B. uplo)), B)
752
- $ f (A:: Hermitian , B:: SymTridiagonal{<:Real} ) = $ f (A, Hermitian (B, sym_uplo (A. uplo)))
747
+ $ f (A:: Hermitian , B:: Symmetric{<:Real} ) = $ f (A, Hermitian (parent (B), _sym_uplo (B. uplo)))
748
+ $ f (A:: Symmetric{<:Real} , B:: Hermitian ) = $ f (Hermitian (parent (A), _sym_uplo (A. uplo)), B)
749
+ $ f (A:: SymTridiagonal , B:: Symmetric ) = $ f (Symmetric (A, _sym_uplo (B. uplo)), B)
750
+ $ f (A:: Symmetric , B:: SymTridiagonal ) = $ f (A, Symmetric (B, _sym_uplo (A. uplo)))
751
+ $ f (A:: SymTridiagonal{<:Real} , B:: Hermitian ) = $ f (Hermitian (A, _sym_uplo (B. uplo)), B)
752
+ $ f (A:: Hermitian , B:: SymTridiagonal{<:Real} ) = $ f (A, Hermitian (B, _sym_uplo (A. uplo)))
753
753
end
754
754
end
755
755
@@ -799,12 +799,12 @@ function dot(x::AbstractVector, A::HermOrSym, y::AbstractVector)
799
799
end
800
800
801
801
# Scaling with Number
802
- * (A:: Symmetric , x:: Number ) = Symmetric (parentof_applytri (y -> y * x, A), sym_uplo (A. uplo))
803
- * (x:: Number , A:: Symmetric ) = Symmetric (parentof_applytri (y -> x * y, A), sym_uplo (A. uplo))
804
- * (A:: Hermitian , x:: Real ) = Hermitian (parentof_applytri (y -> y * x, A), sym_uplo (A. uplo))
805
- * (x:: Real , A:: Hermitian ) = Hermitian (parentof_applytri (y -> x * y, A), sym_uplo (A. uplo))
806
- / (A:: Symmetric , x:: Number ) = Symmetric (parentof_applytri (y -> y/ x, A), sym_uplo (A. uplo))
807
- / (A:: Hermitian , x:: Real ) = Hermitian (parentof_applytri (y -> y/ x, A), sym_uplo (A. uplo))
802
+ * (A:: Symmetric , x:: Number ) = Symmetric (parentof_applytri (y -> y * x, A), _sym_uplo (A. uplo))
803
+ * (x:: Number , A:: Symmetric ) = Symmetric (parentof_applytri (y -> x * y, A), _sym_uplo (A. uplo))
804
+ * (A:: Hermitian , x:: Real ) = Hermitian (parentof_applytri (y -> y * x, A), _sym_uplo (A. uplo))
805
+ * (x:: Real , A:: Hermitian ) = Hermitian (parentof_applytri (y -> x * y, A), _sym_uplo (A. uplo))
806
+ / (A:: Symmetric , x:: Number ) = Symmetric (parentof_applytri (y -> y/ x, A), _sym_uplo (A. uplo))
807
+ / (A:: Hermitian , x:: Real ) = Hermitian (parentof_applytri (y -> y/ x, A), _sym_uplo (A. uplo))
808
808
809
809
factorize (A:: HermOrSym ) = _factorize (A)
810
810
function _factorize (A:: HermOrSym{T} ; check:: Bool = true ) where T
@@ -850,8 +850,8 @@ function _inv(A::HermOrSym)
850
850
B
851
851
end
852
852
# StridedMatrix restriction seems necessary due to inv! call in _inv above
853
- inv (A:: Hermitian{<:Any,<:StridedMatrix} ) = Hermitian (_inv (A), sym_uplo (A. uplo))
854
- inv (A:: Symmetric{<:Any,<:StridedMatrix} ) = Symmetric (_inv (A), sym_uplo (A. uplo))
853
+ inv (A:: Hermitian{<:Any,<:StridedMatrix} ) = Hermitian (_inv (A), _sym_uplo (A. uplo))
854
+ inv (A:: Symmetric{<:Any,<:StridedMatrix} ) = Symmetric (_inv (A), _sym_uplo (A. uplo))
855
855
856
856
function svd (A:: RealHermSymComplexHerm ; full:: Bool = false )
857
857
vals, vecs = eigen (A)
0 commit comments