@@ -76,7 +76,7 @@ BlocksView(a::AbstractArray{S,N}) where {S,N} =
7676Base. IteratorEltype (:: Type{<:BlocksView} ) = Base. EltypeUnknown ()
7777
7878Base. size (a:: BlocksView ) = blocksize (a. array)
79- Base. axes (a:: BlocksView ) = map (br -> only (br. indices ), blockaxes (a. array))
79+ Base. axes (a:: BlocksView ) = map (br -> Int . (br), blockaxes (a. array))
8080
8181#=
8282This is broken for now. See: https://github.com/JuliaArrays/BlockArrays.jl/issues/120
@@ -92,3 +92,48 @@ This is broken for now. See: https://github.com/JuliaArrays/BlockArrays.jl/issue
9292 copyto! (a[i... ], b)
9393 a
9494end
95+
96+ """
97+ blocksizes(A::AbstractArray)
98+ blocksizes(A::AbstractArray, d::Integer)
99+
100+ Return an iterator over the sizes of each block.
101+ See also size and blocksize.
102+
103+ # Examples
104+ ```jldoctest
105+ julia> A = BlockArray(ones(3,3),[2,1],[1,1,1])
106+ 2×3-blocked 3×3 BlockMatrix{Float64}:
107+ 1.0 │ 1.0 │ 1.0
108+ 1.0 │ 1.0 │ 1.0
109+ ─────┼───────┼─────
110+ 1.0 │ 1.0 │ 1.0
111+
112+ julia> blocksizes(A)
113+ 2×3 BlockArrays.BlockSizes{Tuple{Int64, Int64}, 2, BlockMatrix{Float64, Matrix{Matrix{Float64}}, Tuple{BlockedOneTo{Int64, Vector{Int64}}, BlockedOneTo{Int64, Vector{Int64}}}}}:
114+ (2, 1) (2, 1) (2, 1)
115+ (1, 1) (1, 1) (1, 1)
116+
117+ julia> blocksizes(A)[1,2]
118+ (2, 1)
119+
120+ julia> blocksizes(A,2)
121+ 3-element Vector{Int64}:
122+ 1
123+ 1
124+ 1
125+ ```
126+ """
127+ blocksizes (A:: AbstractArray ) = BlockSizes (A)
128+ blocksizes (A:: AbstractArray , d:: Integer ) = blocklengths (axes (A, d))
129+
130+ struct BlockSizes{T,N,A<: AbstractArray{<:Any,N} } <: AbstractArray{T,N}
131+ array:: A
132+ end
133+ BlockSizes (a:: AbstractArray{<:Any,N} ) where {N} =
134+ BlockSizes {Tuple{eltype.(axes(a))...},N,typeof(a)} (a)
135+
136+ size (bs:: BlockSizes ) = blocksize (bs. array)
137+ axes (bs:: BlockSizes ) = map (br -> Int .(br), blockaxes (bs. array))
138+ @propagate_inbounds getindex (a:: BlockSizes{T,N} , i:: Vararg{Int,N} ) where {T,N} =
139+ size (view (a. array, Block .(i)... ))
0 commit comments