diff --git a/src/FillArrays.jl b/src/FillArrays.jl index 94cb8e1b..e3a017d0 100644 --- a/src/FillArrays.jl +++ b/src/FillArrays.jl @@ -414,11 +414,11 @@ inv(IM::Diagonal{<:Any,<:AbstractFill}) = Diagonal(map(inv, IM.diag)) Eye(n::Integer, m::Integer) = RectDiagonal(Ones(min(n,m)), n, m) Eye{T}(n::Integer, m::Integer) where T = RectDiagonal{T}(Ones{T}(min(n,m)), n, m) function Eye{T}((a,b)::NTuple{2,AbstractUnitRange{Int}}) where T - ab = length(a) ≤ length(b) ? a : b + ab = length(a) ≤ length(b) ? a : b RectDiagonal{T}(Ones{T}((ab,)), (a,b)) end function Eye((a,b)::NTuple{2,AbstractUnitRange{Int}}) - ab = length(a) ≤ length(b) ? a : b + ab = length(a) ≤ length(b) ? a : b RectDiagonal(Ones((ab,)), (a,b)) end @@ -586,7 +586,7 @@ function all(f::Function, IM::Eye{T}) where T end # In particular, these make iszero(Eye(n)) efficient. -# use any/all on scalar to get Boolean error message +# use any/all on scalar to get Boolean error message any(f::Function, x::AbstractFill) = isempty(x) || any(f(getindex_value(x))) all(f::Function, x::AbstractFill) = isempty(x) || all(f(getindex_value(x))) any(x::AbstractFill) = isempty(x) || any(getindex_value(x)) @@ -613,18 +613,18 @@ end mean(A::AbstractFill; dims=(:)) = mean(identity, A; dims=dims) function mean(f::Union{Function, Type}, A::AbstractFill; dims=(:)) val = float(f(getindex_value(A))) - dims isa Colon ? val : + dims isa Colon ? val : Fill(val, ntuple(d -> d in dims ? 1 : size(A,d), ndims(A))...) end function var(A::AbstractFill{T}; corrected::Bool=true, mean=nothing, dims=(:)) where {T<:Number} - dims isa Colon ? zero(float(T)) : + dims isa Colon ? zero(float(T)) : Zeros{float(T)}(ntuple(d -> d in dims ? 1 : size(A,d), ndims(A))...) end cov(A::AbstractFill{T,1}; corrected::Bool=true) where {T<:Number} = zero(float(T)) -cov(A::AbstractFill{T,2}; corrected::Bool=true, dims::Integer=1) where {T<:Number} = +cov(A::AbstractFill{T,2}; corrected::Bool=true, dims::Integer=1) where {T<:Number} = Zeros{float(T)}(size(A, 3-dims), size(A, 3-dims)) cor(A::AbstractFill{T,1}) where {T<:Number} = one(float(T)) diff --git a/src/fillalgebra.jl b/src/fillalgebra.jl index 3df1fd21..86a70a99 100644 --- a/src/fillalgebra.jl +++ b/src/fillalgebra.jl @@ -89,11 +89,11 @@ end *(a::Zeros{<:Any,2}, b::Diagonal) = mult_zeros(a, b) *(a::Diagonal, b::Zeros{<:Any,1}) = mult_zeros(a, b) *(a::Diagonal, b::Zeros{<:Any,2}) = mult_zeros(a, b) -function *(a::Diagonal, b::AbstractFill{<:Any,2}) +function *(a::Diagonal, b::AbstractFill{<:Any,2}) size(a,2) == size(b,1) || throw(DimensionMismatch("A has dimensions $(size(a)) but B has dimensions $(size(b))")) a.diag .* b # use special broadcast end -function *(a::AbstractFill{<:Any,2}, b::Diagonal) +function *(a::AbstractFill{<:Any,2}, b::Diagonal) size(a,2) == size(b,1) || throw(DimensionMismatch("A has dimensions $(size(a)) but B has dimensions $(size(b))")) a .* permutedims(b.diag) # use special broadcast end diff --git a/src/fillbroadcast.jl b/src/fillbroadcast.jl index c0a6a158..853f4076 100644 --- a/src/fillbroadcast.jl +++ b/src/fillbroadcast.jl @@ -219,7 +219,7 @@ function broadcasted(::DefaultArrayStyle{1}, ::typeof(+), a::Zeros{T,1}, b::Abst _copy_oftype(b, promote_type(T,V)) end -broadcasted(::DefaultArrayStyle{1}, ::typeof(+), a::Zeros{V,1}, b::AbstractFill{T,1}) where {T,V} = +broadcasted(::DefaultArrayStyle{1}, ::typeof(+), a::Zeros{V,1}, b::AbstractFill{T,1}) where {T,V} = Base.invoke(broadcasted, Tuple{DefaultArrayStyle, typeof(+), AbstractFill, AbstractFill}, DefaultArrayStyle{1}(), +, a, b) # Need to prevent array-valued fills from broadcasting over entry diff --git a/test/runtests.jl b/test/runtests.jl index 368ac186..b690a390 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -488,9 +488,9 @@ end @test Zeros(3, 4) * randn(4) == Zeros(3, 4) * Zeros(4) == Zeros(3) @test Zeros(3, 4) * Zeros(4, 5) === Zeros(3, 5) - @test_throws MethodError [1,2,3]*Zeros(1) # Not defined for [1,2,3]*[0] either + @test_throws MethodError [1,2,3]*Zeros(1) # Not defined for [1,2,3]*[0] either @test [1,2,3]*Zeros(1,3) ≡ Zeros(3,3) - @test_throws MethodError [1,2,3]*Zeros(3) # Not defined for [1,2,3]*[0,0,0] either + @test_throws MethodError [1,2,3]*Zeros(3) # Not defined for [1,2,3]*[0,0,0] either @testset "Check multiplication by Adjoint vectors works as expected." begin @test randn(4, 3)' * Zeros(4) === Zeros(3) @@ -499,7 +499,7 @@ end @test [SVector(1,2)', SVector(2,3)', SVector(3,4)']' * Zeros{Int}(3) === SVector(0,0) @test_throws DimensionMismatch randn(4)' * Zeros(3) @test Zeros(5)' * randn(5,3) ≡ Zeros(5)'*Zeros(5,3) ≡ Zeros(5)'*Ones(5,3) ≡ Zeros(3)' - @test Zeros(5)' * randn(5) ≡ Zeros(5)' * Zeros(5) ≡ Zeros(5)' * Ones(5) ≡ 0.0 + @test Zeros(5)' * randn(5) ≡ Zeros(5)' * Zeros(5) ≡ Zeros(5)' * Ones(5) ≡ 0.0 @test Zeros(5) * Zeros(6)' ≡ Zeros(5,1) * Zeros(6)' ≡ Zeros(5,6) @test randn(5) * Zeros(6)' ≡ randn(5,1) * Zeros(6)' ≡ Zeros(5,6) @test Zeros(5) * randn(6)' ≡ Zeros(5,6) @@ -514,7 +514,7 @@ end @test transpose([1, 2, 3]) * Zeros{Int}(3) === zero(Int) @test_throws DimensionMismatch transpose(randn(4)) * Zeros(3) @test transpose(Zeros(5)) * randn(5,3) ≡ transpose(Zeros(5))*Zeros(5,3) ≡ transpose(Zeros(5))*Ones(5,3) ≡ transpose(Zeros(3)) - @test transpose(Zeros(5)) * randn(5) ≡ transpose(Zeros(5)) * Zeros(5) ≡ transpose(Zeros(5)) * Ones(5) ≡ 0.0 + @test transpose(Zeros(5)) * randn(5) ≡ transpose(Zeros(5)) * Zeros(5) ≡ transpose(Zeros(5)) * Ones(5) ≡ 0.0 @test randn(5) * transpose(Zeros(6)) ≡ randn(5,1) * transpose(Zeros(6)) ≡ Zeros(5,6) @test Zeros(5) * transpose(randn(6)) ≡ Zeros(5,6) @test transpose(randn(5)) * Zeros(5) ≡ 0.0 @@ -862,7 +862,7 @@ end @test map(+, x1, x2) === Fill(3.0, 5) @test map(+, x2, x2) === x2 .+ x2 @test_throws DimensionMismatch map(+, x2', x2) - + # Issue https://github.com/JuliaArrays/FillArrays.jl/issues/179 @test map(() -> "ok") == "ok" # was MethodError: reducing over an empty collection is not allowed @test mapreduce(() -> "ok", *) == "ok" @@ -1065,7 +1065,7 @@ end @testset "Eye identity ops" begin m = Eye(10) D = Diagonal(Fill(2,10)) - + for op in (permutedims, inv) @test op(m) === m end @@ -1232,8 +1232,8 @@ end @testset "count" begin @test count(Ones{Bool}(10)) == count(Fill(true,10)) == 10 @test count(Zeros{Bool}(10)) == count(Fill(false,10)) == 0 - @test count(x -> 1 ≤ x < 2, Fill(1.3,10)) == 10 - @test count(x -> 1 ≤ x < 2, Fill(2.0,10)) == 0 + @test count(x -> 1 ≤ x < 2, Fill(1.3,10)) == 10 + @test count(x -> 1 ≤ x < 2, Fill(2.0,10)) == 0 end @testset "norm" begin