@@ -4,27 +4,14 @@ using LinearAlgebra: Diagonal
44const BlockDiagonal{T,A,Axes,V<: AbstractVector{A} } = BlockSparseMatrix{
55 T,A,Diagonal{A,V},Axes
66}
7+ const BlockSparseDiagonal{T,A<: AbstractBlockSparseVector{T} } = Diagonal{T,A}
8+
9+ @interface interface:: BlockSparseArrayInterface function blocks (a:: BlockSparseDiagonal )
10+ return Diagonal (Diagonal .(blocks (a. diag)))
11+ end
712
813function BlockDiagonal (blocks:: AbstractVector{<:AbstractMatrix} )
914 return BlockSparseArray (
1015 Diagonal (blocks), (blockedrange (size .(blocks, 1 )), blockedrange (size .(blocks, 2 )))
1116 )
1217end
13-
14- # SVD implementation
15- function eigencopy_oftype (A:: BlockDiagonal , T)
16- diag = map (Base. Fix2 (eigencopy_oftype, T), LinearAlgebra. diag (blocks (A)))
17- return BlockDiagonal (diag)
18- end
19-
20- function svd (A:: BlockDiagonal ; kwargs... )
21- return svd! (eigencopy_oftype (A, LinearAlgebra. eigtype (eltype (A))); kwargs... )
22- end
23- function svd! (A:: BlockDiagonal ; full:: Bool = false , alg:: Algorithm = default_svd_alg (A))
24- # TODO : handle full
25- F = map (a -> svd! (a; full, alg), blocks (A). diag)
26- Us = map (Base. Fix2 (getproperty, :U ), F)
27- Ss = map (Base. Fix2 (getproperty, :S ), F)
28- Vts = map (Base. Fix2 (getproperty, :Vt ), F)
29- return SVD (BlockDiagonal (Us), mortar (Ss), BlockDiagonal (Vts))
30- end
0 commit comments