diff --git a/Project.toml b/Project.toml index e353618c..0d8d9d05 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "BandedMatrices" uuid = "aae01518-5342-5314-be14-df237901396f" -version = "1.9.0" +version = "1.9.1" [deps] ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" diff --git a/src/generic/broadcast.jl b/src/generic/broadcast.jl index 110bf0da..6fbf36ec 100644 --- a/src/generic/broadcast.jl +++ b/src/generic/broadcast.jl @@ -357,6 +357,7 @@ function _banded_broadcast_BandedColumn!(dest, f, src, z) end function _banded_broadcast!(dest::AbstractMatrix, f, (src,x)::Tuple{AbstractMatrix{T},Number}, ::BandedColumns, ::BandedColumns) where T + isprimitivetype(T) || return _banded_broadcast!(dest, f, (src, x), BandedLayout(), BandedLayout()) z = f(zero(T),x) iszero(z) || checkbroadcastband(dest, size(src), bandwidths(broadcasted(f, src,x))) @@ -367,6 +368,8 @@ function _banded_broadcast!(dest::AbstractMatrix, f, (src,x)::Tuple{AbstractMatr end function _banded_broadcast!(dest::AbstractMatrix, f, (x, src)::Tuple{Number,AbstractMatrix{T}}, ::BandedColumns, ::BandedColumns) where T + isprimitivetype(T) || return _banded_broadcast!(dest, f, (x, src), BandedLayout(), BandedLayout()) + z = f(x, zero(T)) iszero(z) || checkbroadcastband(dest, size(src), bandwidths(broadcasted(f, x,src))) @@ -824,12 +827,14 @@ function _banded_broadcast(f, A::AbstractMatrix{T}, ::BandedColumns) where T _BandedMatrix(Bdata_new, axes(A,1), bandwidths(A)...) end function _banded_broadcast(f, (src,x)::Tuple{AbstractMatrix{T},Number}, ::BandedColumns) where T + isprimitivetype(T) || return _banded_broadcast(f, (src,x), BandedLayout()) iszero(f(zero(T),x)) || return _default_banded_broadcast(broadcasted(f, src,x)) Bdata = bandeddata(src) Bdata_new = reshape(f.(vec(Bdata), x), size(Bdata)) _BandedMatrix(Bdata_new, axes(src,1), bandwidths(src)...) end function _banded_broadcast(f, (x, src)::Tuple{Number,AbstractMatrix{T}}, ::BandedColumns) where T + isprimitivetype(T) || return _banded_broadcast(f, (x,src), BandedLayout()) iszero(f(x, zero(T))) || return _default_banded_broadcast(broadcasted(f, x,src)) Bdata = bandeddata(src) Bdata_new = reshape(f.(x, vec(Bdata)), size(Bdata)) @@ -935,12 +940,20 @@ end function _banded_lmul!(α::Number, A::AbstractMatrix, ::BandedColumns) - lmul!(α, bandeddata(A)) + if !isprimitivetype(eltype(A)) + _banded_lmul!(α, A, BandedLayout()) # avoid undefined + else + lmul!(α, bandeddata(A)) + end A end function _banded_rmul!(A::AbstractMatrix, α::Number, ::BandedColumns) - rmul!(bandeddata(A), α) + if !isprimitivetype(eltype(A)) + _banded_rmul!(A, α, BandedLayout()) # avoid undefined + else + rmul!(bandeddata(A), α) + end A end diff --git a/test/test_broadcasting.jl b/test/test_broadcasting.jl index 04b0bc70..2d3e227d 100644 --- a/test/test_broadcasting.jl +++ b/test/test_broadcasting.jl @@ -770,6 +770,19 @@ Random.seed!(0) @test_throws BandError B[band(100)] .= 10 @test_throws BandError B[band(-100)] .= 10 end + + @testset "BigFloat l/rmul!" begin + A = BandedMatrices._BandedMatrix(Matrix{BigFloat}(undef, 3, 5), 5, 1, 1) + for j = axes(A,2), k = colsupport(A,j) + A[k,j] = 1 + end + B = 2A + @test B == A*2 + lmul!(2, A) + @test A == B + rmul!(A, 2) + @test A == 2B + end end end # module