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?