1
1
# Core functionality for the `BlockDiagonal` type
2
2
3
3
"""
4
- BlockDiagonal{T, V<: AbstractMatrix{T}} <: AbstractMatrix{T}
4
+ BlockDiagonal{T, BV<:AbstractVector{<: AbstractMatrix{T} }} <: AbstractMatrix{T}
5
5
6
6
A matrix with matrices on the diagonal, and zeros off the diagonal.
7
7
"""
8
- struct BlockDiagonal{T,V <: AbstractMatrix{T} } <: AbstractMatrix{T}
9
- blocks:: Vector{V}
8
+ struct BlockDiagonal{T,BV <: AbstractVector{<: AbstractMatrix{T} } } <: AbstractMatrix{T}
9
+ blocks:: BV
10
10
11
- function BlockDiagonal {T,V } (blocks:: Vector {V} ) where {T,V<: AbstractMatrix{T} }
12
- return new {T,V } (blocks)
11
+ function BlockDiagonal {T,BV } (blocks:: AbstractVector {V} ) where {T,V<: AbstractMatrix{T} ,BV <: AbstractVector{V } }
12
+ return new {T,typeof(blocks) } (blocks)
13
13
end
14
14
end
15
15
16
- function BlockDiagonal (blocks:: Vector {V} ) where {T,V<: AbstractMatrix{T} }
17
- return BlockDiagonal {T,V } (blocks)
16
+ function BlockDiagonal (blocks:: AbstractVector {V} ) where {T,V<: AbstractMatrix{T} }
17
+ return BlockDiagonal {T,typeof(blocks) } (blocks)
18
18
end
19
19
20
20
BlockDiagonal (B:: BlockDiagonal ) = B
21
21
22
22
is_square (A:: AbstractMatrix ) = size (A, 1 ) == size (A, 2 )
23
23
24
24
"""
25
- blocks(B::BlockDiagonal{T, V} ) -> Vector{V }
25
+ blocks(B::BlockDiagonal{T, Vector{Matrix{T}}} ) -> Vector{Matrix{T} }
26
26
27
27
Return the on-diagonal blocks of B.
28
28
"""
@@ -86,7 +86,7 @@ function getblock(B::BlockDiagonal{T}, p::Integer, q::Integer) where {T}
86
86
return p == q ? blocks (B)[p] : Zeros {T} (blocksize (B, p, q))
87
87
end
88
88
89
- function setblock! (B:: BlockDiagonal{T,V} , v:: V , p:: Integer ) where {T,V }
89
+ function setblock! (B:: BlockDiagonal{T,V} , v:: W , p:: Integer ) where {T,W,V <: AbstractVector{W} }
90
90
if blocksize (B, p) != size (v)
91
91
throw (
92
92
DimensionMismatch (
@@ -97,7 +97,7 @@ function setblock!(B::BlockDiagonal{T,V}, v::V, p::Integer) where {T,V}
97
97
return blocks (B)[p] = v
98
98
end
99
99
100
- function setblock! (B:: BlockDiagonal{T,V} , v:: V , p:: Int , q:: Int ) where {T,V }
100
+ function setblock! (B:: BlockDiagonal{T,V} , v:: W , p:: Int , q:: Int ) where {T,W,V <: AbstractVector{W} }
101
101
p == q ||
102
102
throw (ArgumentError (" Cannot set off-diagonal block ($p , $q ) to non-zero value." ))
103
103
return setblock! (B, v, p)
155
155
end
156
156
157
157
function Base. convert (:: Type{BlockDiagonal{T,M}} , b:: BlockDiagonal ) where {T,M}
158
- new_blocks = convert . (M, blocks (b))
158
+ new_blocks = convert (M, blocks (b))
159
159
return BlockDiagonal (new_blocks):: BlockDiagonal{T,M}
160
160
end
161
161
0 commit comments