Thanks, James. Is this worthy of a github issue?
On Tuesday, September 8, 2015 at 5:00:53 PM UTC-7, James Fairbanks wrote:
>
> #= This is the function from Base that is being used when you call & on
>>> two sparse matrices
>>> function ($f){S,T}(A::AbstractArray{S}, B::AbstractArray{T})
>>> F = similar(A, promote_op($F,S,T), promote_shape(size(A),size(B)))
>>> for i in eachindex(A,B)
>>> @inbounds F[i] = ($f)(A[i], B[i])
>>> end
>>> return F
>>> end
>>>
>>> # look at what eachindex does for SparseMatrixCSC
>>> a = sprand(10,10,0.3)
>>> @show collect(eachindex(a))
>>> 100-element Array{CartesianIndex{2},1}:
>>> CartesianIndex{2}((1,1))
>>> CartesianIndex{2}((2,1))
>>> CartesianIndex{2}((3,1))
>>> CartesianIndex{2}((4,1))
>>> CartesianIndex{2}((5,1))
>>> CartesianIndex{2}((6,1))
>>> CartesianIndex{2}((7,1))
>>> CartesianIndex{2}((8,1))
>>> CartesianIndex{2}((9,1))
>>> CartesianIndex{2}((10,1))
>>> CartesianIndex{2}((1,2))
>>> CartesianIndex{2}((2,2))
>>> CartesianIndex{2}((3,2))
>>> CartesianIndex{2}((4,2))
>>> ⋮
>>> CartesianIndex{2}((6,8))
>>> CartesianIndex{2}((7,8))
>>> CartesianIndex{2}((8,8))
>>> CartesianIndex{2}((9,8))
>>> CartesianIndex{2}((10,8))
>>> CartesianIndex{2}((1,9))
>>> CartesianIndex{2}((2,9))
>>> CartesianIndex{2}((3,9))
>>> CartesianIndex{2}((4,9))
>>> CartesianIndex{2}((5,9))
>>> CartesianIndex{2}((6,9))
>>> CartesianIndex{2}((7,9))
>>> CartesianIndex{2}((8,9))
>>> CartesianIndex{2}((9,9))
>>> CartesianIndex{2}((10,9))
>>> CartesianIndex{2}((1,10))
>>> CartesianIndex{2}((2,10))
>>> CartesianIndex{2}((3,10))
>>> CartesianIndex{2}((4,10))
>>> CartesianIndex{2}((5,10))
>>> CartesianIndex{2}((6,10))
>>> CartesianIndex{2}((7,10))
>>> CartesianIndex{2}((8,10))
>>> CartesianIndex{2}((9,10))
>>> CartesianIndex{2}((10,10))
>>>
>>> The problem is that the generic AbstractArray implementation of & and
> some other operators is iterating over all the n x m entries of A.
>