Hi all, I ran into some puzzling performance today with sparse matrices. I defined
_column(a::AbstractSparseArray, i::Integer) = sub(a.rowval, a.colptr[i]:a. colptr[i+1]-1) # material nonimplication ⊅(p::Bool, q::Bool) = p & !q function ⊅(a::SparseMatrixCSC, b::SparseMatrixCSC) (m,n) = size(a) resultmx = spzeros(Bool,m,n) for c = 1:n for r in _column(a,n) # info("row $r, col $c") resultmx[r,c] = ⊅(a[r,c], b[r,c]) end end return resultmx end a = sprandbool(1000000,1000000,0.0001) b = sprandbool(1000000,1000000,0.0001) and ran it in comparison with the & operator: julia> @time z = a ⊅ b; 15.272250 seconds (1.10 M allocations: 73.870 MB) julia> @time z = a & b; # this is still going ~10 minutes later. It seems strange that my home-grown function is orders of magnitude more efficient than a built-in boolean primitive. Am I missing something?