Skip to content

Commit a9c8ee0

Browse files
committed
Provide specialized typed_[hv]cat(::Type{SparseVector}, ...)
And make hcat/vcat involving SparseVectors just call the corresponding typed_*cat function.
1 parent fc90ec7 commit a9c8ee0

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

base/sparse/sparsevector.jl

+22-6
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,9 @@ complex(x::AbstractSparseVector) =
703703

704704
### Concatenation
705705

706-
function hcat{Tv,Ti}(X::AbstractSparseVector{Tv,Ti}...)
706+
promote_indtype{Tv,Ti}(X::SparseVector{Tv,Ti}, Xs::SparseVector...) = promote_type(Ti, promote_indtype(Xs...))
707+
708+
function typed_hcat{Tv,Ti<:Integer}(::Type{SparseMatrixCSC{Tv,Ti}}, X::AbstractSparseVector...)
707709
# check sizes
708710
n = length(X)
709711
m = length(X[1])
@@ -731,8 +733,15 @@ function hcat{Tv,Ti}(X::AbstractSparseVector{Tv,Ti}...)
731733
colptr[n+1] = roff
732734
SparseMatrixCSC{Tv,Ti}(m, n, colptr, nzrow, nzval)
733735
end
736+
typed_hcat(::Type{SparseMatrixCSC}, X::AbstractSparseVector...) =
737+
typed_hcat(SparseMatrixCSC{promote_eltype(X...)}, X...)
738+
typed_hcat{Tv}(::Type{SparseMatrixCSC{Tv}}, X::AbstractSparseVector...) =
739+
typed_hcat(SparseMatrixCSC{Tv,promote_indtype(X...)}, X...)
740+
typed_hcat{T<:SparseMatrixCSC}(::Type{T}, Xin::AbstractVector...) =
741+
typed_hcat(T, map(sparse, Xin)...)
734742

735-
function vcat{Tv,Ti}(X::AbstractSparseVector{Tv,Ti}...)
743+
typed_vcat{T<:SparseVector}(::Type{T}) = T(0)
744+
function typed_vcat{Tv,Ti<:Integer}(::Type{SparseVector{Tv,Ti}}, X::AbstractSparseVector...)
736745
# check sizes
737746
n = length(X)
738747
tnnz = 0
@@ -759,11 +768,18 @@ function vcat{Tv,Ti}(X::AbstractSparseVector{Tv,Ti}...)
759768
end
760769
SparseVector(len, rnzind, rnzval)
761770
end
771+
typed_vcat(::Type{SparseVector}, X::AbstractSparseVector...) =
772+
typed_vcat(SparseVector{promote_eltype(X...)}, X...)
773+
typed_vcat{Tv}(::Type{SparseVector{Tv}}, X::AbstractSparseVector...) =
774+
typed_vcat(SparseVector{Tv,promote_indtype(X...)}, X...)
775+
typed_vcat{T<:SparseVector}(::Type{T}, Xin::AbstractVector...) =
776+
typed_vcat(T, map(sparse, Xin)...)
777+
778+
hcat(Xin::Union{Vector, AbstractSparseVector, SparseMatrixCSC}...) = typed_hcat(SparseMatrixCSC, Xin...)
762779

763-
hcat(Xin::Union{AbstractSparseVector, SparseMatrixCSC}...) = hcat(map(SparseMatrixCSC, Xin)...)
764-
vcat(Xin::Union{AbstractSparseVector, SparseMatrixCSC}...) = vcat(map(SparseMatrixCSC, Xin)...)
765-
hcat(Xin::Union{Vector, AbstractSparseVector}...) = hcat(map(sparse, Xin)...)
766-
vcat(Xin::Union{Vector, AbstractSparseVector}...) = vcat(map(sparse, Xin)...)
780+
vcat(Xin::Union{AbstractSparseVector, SparseMatrixCSC}...) = typed_vcat(SparseMatrixCSC, Xin...)
781+
vcat(Xin::Union{Vector, AbstractSparseVector}...) = typed_vcat(SparseVector, Xin...)
782+
vcat(Xin::AbstractSparseVector...) = typed_vcat(SparseVector, Xin...)
767783

768784
### math functions
769785

0 commit comments

Comments
 (0)