Skip to content

Commit 8e78b26

Browse files
committed
Use broadcast for element wise operators where appropriate
1 parent a9dc134 commit 8e78b26

File tree

2 files changed

+9
-7
lines changed

2 files changed

+9
-7
lines changed

base/broadcast.jl

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ end
234234
end
235235

236236
# broadcast methods that dispatch on the type found by inference
237-
function _broadcast_t(f, ::Type{Any}, shape, iter, As...)
237+
function broadcast_t(f, ::Type{Any}, shape, iter, As...)
238238
nargs = length(As)
239239
keeps, Idefaults = map_newindexer(shape, As)
240240
st = start(iter)
@@ -244,7 +244,7 @@ function _broadcast_t(f, ::Type{Any}, shape, iter, As...)
244244
B[I] = val
245245
return _broadcast!(f, B, keeps, Idefaults, As, Val{nargs}, iter, st, 1)
246246
end
247-
@inline function _broadcast_t(f, T, shape, iter, As...)
247+
@inline function broadcast_t(f, T, shape, iter, As...)
248248
B = similar(Array{T}, shape)
249249
nargs = length(As)
250250
keeps, Idefaults = map_newindexer(shape, As)
@@ -254,7 +254,8 @@ end
254254

255255
# broadcast method that uses inference to find the type, but preserves abstract
256256
# container types when possible (used by binary elementwise operators)
257-
@inline broadcast_t(f, As...) = broadcast!(f, similar(Array{promote_eltype_op(f, As...)}, broadcast_indices(As...)), As...)
257+
@inline broadcast_elwise_op(f, As...) =
258+
broadcast!(f, similar(Array{promote_eltype_op(f, As...)}, broadcast_indices(As...)), As...)
258259

259260
ftype(f, A) = typeof(a -> f(a))
260261
ftype(f, A...) = typeof(a -> f(a...))
@@ -465,10 +466,10 @@ end
465466
## elementwise operators ##
466467

467468
for op in (:÷, :%, :<<, :>>, :-, :/, :\, ://, :^)
468-
@eval $(Symbol(:., op))(A::AbstractArray, B::AbstractArray) = broadcast_t($op, A, B)
469+
@eval $(Symbol(:., op))(A::AbstractArray, B::AbstractArray) = broadcast_elwise_op($op, A, B)
469470
end
470-
.+(As::AbstractArray...) = broadcast_t(+, As...)
471-
.*(As::AbstractArray...) = broadcast_t(*, As...)
471+
.+(As::AbstractArray...) = broadcast_elwise_op(+, As...)
472+
.*(As::AbstractArray...) = broadcast_elwise_op(*, As...)
472473

473474
# ## element-wise comparison operators returning BitArray ##
474475

base/sparse/sparsematrix.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1740,7 +1740,7 @@ broadcast{Tv1,Ti1,Tv2,Ti2}(f::Function, A_1::SparseMatrixCSC{Tv1,Ti1}, A_2::Spar
17401740
broadcast!(f, spzeros(promote_type(Tv1, Tv2), promote_type(Ti1, Ti2), to_shape(broadcast_indices(A_1, A_2))), A_1, A_2)
17411741

17421742
@inline broadcast_zpreserving!(args...) = broadcast!(args...)
1743-
@inline broadcast_zpreserving(args...) = broadcast(args...)
1743+
@inline broadcast_zpreserving(args...) = Base.Broadcast.broadcast_elwise_op(args...)
17441744
broadcast_zpreserving{Tv1,Ti1,Tv2,Ti2}(f::Function, A_1::SparseMatrixCSC{Tv1,Ti1}, A_2::SparseMatrixCSC{Tv2,Ti2}) =
17451745
broadcast_zpreserving!(f, spzeros(promote_type(Tv1, Tv2), promote_type(Ti1, Ti2), to_shape(broadcast_indices(A_1, A_2))), A_1, A_2)
17461746
broadcast_zpreserving{Tv,Ti}(f::Function, A_1::SparseMatrixCSC{Tv,Ti}, A_2::Union{Array,BitArray,Number}) =
@@ -1777,6 +1777,7 @@ end # macro
17771777
(.-)(A::Number, B::SparseMatrixCSC) = A .- Array(B)
17781778
( -)(A::Array , B::SparseMatrixCSC) = A - Array(B)
17791779

1780+
(.*)(A::AbstractArray, B::AbstractArray) = broadcast_zpreserving(*, A, B)
17801781
(.*)(A::SparseMatrixCSC, B::Number) = SparseMatrixCSC(A.m, A.n, copy(A.colptr), copy(A.rowval), A.nzval .* B)
17811782
(.*)(A::Number, B::SparseMatrixCSC) = SparseMatrixCSC(B.m, B.n, copy(B.colptr), copy(B.rowval), A .* B.nzval)
17821783

0 commit comments

Comments
 (0)