Open
Description
Hi,
The current implementation seems to produce a dense result vector which is then converted to sparse before returning. I ran into memory scaling issues. Perhaps something along the lines of my_mul
below would be worth having?
A = sprand(100000000,1000,.00001)
x = sprand(1000, 0.3)
@time y1=A*x
@time y2=my_mul(A,x)
@assert y1.nzval==y2.nzval
@assert y1.nzind==y2.nzind
0.511000 seconds (11 allocations: 778.183 MB, 16.05% gc time)
0.073359 seconds (59 allocations: 21.794 MB)
function my_mul{TvA,TiA,TvX,TiX}(A::SparseMatrixCSC{TvA,TiA}, x::AbstractSparseVector{TvX,TiX})
m, n = size(A)
length(x) == n || throw(DimensionMismatch())
Tv = promote_type(TvA, TvX)
Ti = promote_type(TiA, TiX)
xnzind = x.nzind
xnzval = x.nzval
Acolptr = A.colptr
Arowval = A.rowval
Anzval = A.nzval
ynzind=Ti[]
ynzval=Tv[]
m == 0 && return sparsevec(ynzind, ynzval, m)
@inbounds for i = 1:length(xnzind)
v = xnzval[i]
if v != zero(v)
j = xnzind[i]
for r = A.colptr[j]:(Acolptr[j+1]-1)
push!(ynzind, Arowval[r])
push!(ynzval, Anzval[r] * v)
end
end
end
return sparsevec(ynzind, ynzval, m)
end