diff --git a/Project.toml b/Project.toml index 52ae1e63..fbe8ecd3 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "BlockArrays" uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" -version = "1.9.3" +version = "1.9.4" [deps] diff --git a/src/abstractblockarray.jl b/src/abstractblockarray.jl index fad86696..689dc689 100644 --- a/src/abstractblockarray.jl +++ b/src/abstractblockarray.jl @@ -267,6 +267,7 @@ end getindex(A::Adjoint{<:Any,<:LayoutMatrix}, kr::BlockRange{1}, jr::BlockRange{1}) = parent(A)[jr,kr]' getindex(A::Transpose{<:Any,<:LayoutMatrix}, kr::BlockRange{1}, jr::BlockRange{1}) = transpose(parent(A)[jr,kr]) +getindex(A::AdjOrTrans{<:Any,<:LayoutVector}, kr::BlockRange{1}, jr::BlockRange{1}) = ArrayLayouts.layout_getindex(A, kr, jr) ### # permutedims diff --git a/src/blockbroadcast.jl b/src/blockbroadcast.jl index e06c91e9..c1180268 100644 --- a/src/blockbroadcast.jl +++ b/src/blockbroadcast.jl @@ -142,8 +142,13 @@ function _generic_blockbroadcast_copyto!(dest::AbstractArray, bc = Broadcast.flatten(bc1) NArgs = length(bc.args) - bs = axes(bc) + + if !all(a -> !(a isa AbstractArray) || size(a) == size(dest), bc.args) + # code below assumes only scalars and matching sizes. We therefore go back to default. + return copyto!(dest, Broadcasted{DefaultArrayStyle{NDims}}(bc.f, bc.args, bs)) + end + if !blockisequal(axes(dest), bs) copyto!(BlockedArray(dest, bs), bc) return dest @@ -267,14 +272,12 @@ BroadcastStyle(::Type{<:SubArray{<:Any,N,<:BlockedArray,I}}) where {N,I<:Tuple{A for op in (:*, :/) @eval begin broadcasted(::AbstractBlockStyle, ::typeof($op), a::Zeros, b::AbstractArray) = FillArrays._broadcasted_zeros($op, a, b) - broadcasted(::AbstractBlockStyle, ::typeof($op), a::Ones{T}, b::AbstractArray{V}) where {T,V} = LinearAlgebra.copy_oftype(b, Base.promote_op(*, T, V)) end end for op in (:*, :\) @eval begin broadcasted(::AbstractBlockStyle, ::typeof($op), a::AbstractArray, b::Zeros) = FillArrays._broadcasted_zeros($op, a, b) - broadcasted(::AbstractBlockStyle, ::typeof($op), a::AbstractArray{T}, b::Ones{V}) where {T,V} = LinearAlgebra.copy_oftype(a, Base.promote_op(*, T, V)) end end diff --git a/test/test_blockarrays.jl b/test/test_blockarrays.jl index 537792e6..29e9bc66 100644 --- a/test/test_blockarrays.jl +++ b/test/test_blockarrays.jl @@ -1066,6 +1066,9 @@ end @test (a')[:,Block.(1:2)] == transpose(a)[:,Block.(1:2)] == [1 2 3] @test (a')[:,Block.(1:2)] isa Adjoint @test transpose(a)[:,Block.(1:2)] isa Transpose + + @test a'[Block.(1:1), Block.(2:3)] == a'[Block.(1:1), 3:4] == a'[Block(1), Block.(2:3)] == a'[Block(1)[1:1], Block.(2:3)] == [3 4] + @test a'[Block.(1:1), Block(2)[1:1]] == a'[Block(1), Block(2)[1:1]] == [3;;] end @testset "empty blocklengths" begin diff --git a/test/test_blockbroadcast.jl b/test/test_blockbroadcast.jl index b9a826df..cbfdd97c 100644 --- a/test/test_blockbroadcast.jl +++ b/test/test_blockbroadcast.jl @@ -327,6 +327,12 @@ using StaticArrays @test issorted(w) @test w == reverse(v) end + + @testset "Ones bug" begin + a = Ones((blockedrange([1,2]),)) + b = BlockArray([1 2 3], [1], [2,1]) + @test a .* b == Vector(a) .* b == a .* Matrix(b) == Vector(a) .* Matrix(b) == b .* a == Matrix(b) .* a == b .* Vector(a) + end end end # module