Skip to content

Commit a3261ff

Browse files
authored
Overload getindex for adjoints/transposes to call parent (#304)
* Overload getindex for adjoints/transposes to call parent * StridedArray similars should be PseudoBlockArray * Update test_blockarrays.jl * Update Project.toml
1 parent e0c0b18 commit a3261ff

File tree

4 files changed

+13
-8
lines changed

4 files changed

+13
-8
lines changed

Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "BlockArrays"
22
uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e"
3-
version = "0.16.36"
3+
version = "0.16.37"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"

src/abstractblockarray.jl

+4-1
Original file line numberDiff line numberDiff line change
@@ -222,10 +222,13 @@ end
222222
@inline getindex(A::AbstractMatrix, kr::AbstractVector, jr::Block) = ArrayLayouts.layout_getindex(A, kr, jr)
223223
@inline getindex(A::AbstractMatrix, kr::BlockRange{1}, jr::BlockRange{1}) = ArrayLayouts.layout_getindex(A, kr, jr)
224224
@inline getindex(A::LayoutMatrix, kr::BlockRange{1}, jr::BlockRange{1}) = ArrayLayouts.layout_getindex(A, kr, jr)
225-
for Typ in (:UpperOrLowerTriangular, :Adjoint, :Transpose, :Symmetric, :Hermitian)
225+
for Typ in (:UpperOrLowerTriangular, :Symmetric, :Hermitian)
226226
@eval @inline getindex(A::$Typ{<:Any,<:LayoutMatrix}, kr::BlockRange{1}, jr::BlockRange{1}) = ArrayLayouts.layout_getindex(A, kr, jr)
227227
end
228228

229+
getindex(A::Adjoint{<:Any,<:LayoutMatrix}, kr::BlockRange{1}, jr::BlockRange{1}) = parent(A)[jr,kr]'
230+
getindex(A::Transpose{<:Any,<:LayoutMatrix}, kr::BlockRange{1}, jr::BlockRange{1}) = transpose(parent(A)[jr,kr])
231+
229232
###
230233
# permutedims
231234
#

src/pseudo_blockarray.jl

+6-6
Original file line numberDiff line numberDiff line change
@@ -203,18 +203,18 @@ end
203203
to_axes(r::AbstractUnitRange) = r
204204
to_axes(n::Integer) = Base.oneto(n)
205205

206-
@inline Base.similar(block_array::Type{<:Array{T}}, axes::Tuple{BlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{Int}}}}) where T =
206+
@inline Base.similar(block_array::Type{<:StridedArray{T}}, axes::Tuple{BlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{Int}}}}) where T =
207207
PseudoBlockArray{T}(undef, map(to_axes,axes))
208-
@inline Base.similar(block_array::Type{<:Array{T}}, axes::Tuple{BlockedUnitRange,BlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{Int}}}}) where T =
208+
@inline Base.similar(block_array::Type{<:StridedArray{T}}, axes::Tuple{BlockedUnitRange,BlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{Int}}}}) where T =
209209
PseudoBlockArray{T}(undef, map(to_axes,axes))
210-
@inline Base.similar(block_array::Type{<:Array{T}}, axes::Tuple{Union{Integer,AbstractUnitRange{Int}},BlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{Int}}}}) where T =
210+
@inline Base.similar(block_array::Type{<:StridedArray{T}}, axes::Tuple{Union{Integer,AbstractUnitRange{Int}},BlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{Int}}}}) where T =
211211
PseudoBlockArray{T}(undef, map(to_axes,axes))
212212

213-
@inline Base.similar(block_array::Array, ::Type{T}, axes::Tuple{BlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{Int}}}}) where T =
213+
@inline Base.similar(block_array::StridedArray, ::Type{T}, axes::Tuple{BlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{Int}}}}) where T =
214214
PseudoBlockArray{T}(undef, map(to_axes,axes))
215-
@inline Base.similar(block_array::Array, ::Type{T}, axes::Tuple{BlockedUnitRange,BlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{Int}}}}) where T =
215+
@inline Base.similar(block_array::StridedArray, ::Type{T}, axes::Tuple{BlockedUnitRange,BlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{Int}}}}) where T =
216216
PseudoBlockArray{T}(undef, map(to_axes,axes))
217-
@inline Base.similar(block_array::Array, ::Type{T}, axes::Tuple{Union{Integer,AbstractUnitRange{Int}},BlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{Int}}}}) where T =
217+
@inline Base.similar(block_array::StridedArray, ::Type{T}, axes::Tuple{Union{Integer,AbstractUnitRange{Int}},BlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{Int}}}}) where T =
218218
PseudoBlockArray{T}(undef, map(to_axes,axes))
219219

220220
@inline Base.similar(block_array::PseudoBlockArray, ::Type{T}, axes::Tuple{BlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{Int}}}}) where T =

test/test_blockarrays.jl

+2
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ end
135135

136136
@test similar(randn(6,5), Float64, (blockedrange(1:3),3)) isa PseudoBlockMatrix
137137
@test similar(randn(6,5), Float64, (3,blockedrange(1:3))) isa PseudoBlockMatrix
138+
@test similar(typeof(view(randn(5),1:3)), (blockedrange(1:3),)) isa PseudoBlockVector
139+
@test similar(view(randn(5),1:3), Int, (blockedrange(1:3),)) isa PseudoBlockVector{Int}
138140
end
139141

140142
@test_throws DimensionMismatch BlockArray([1,2,3],[1,1])

0 commit comments

Comments
 (0)