diff --git a/NEWS.md b/NEWS.md index ba4ecbba6a30f..df9b2b5957022 100644 --- a/NEWS.md +++ b/NEWS.md @@ -76,6 +76,8 @@ Compiler improvements Library improvements -------------------- + * `sparse(A)` now takes any `AbstractMatrix` A as an argument. ([#10031]) + * Factorization api is now type-stable, functions dispatch on `Val{false}` or `Val{true}` instead of a boolean value ([#9575]). * `convert` now checks for overflow when truncating integers or converting between diff --git a/base/array.jl b/base/array.jl index 11c2be8450422..90c4047a8cc61 100644 --- a/base/array.jl +++ b/base/array.jl @@ -1162,7 +1162,7 @@ function findn(A::StridedMatrix) return (I, J) end -function findnz{T}(A::StridedMatrix{T}) +function findnz{T}(A::AbstractMatrix{T}) nnzA = countnz(A) I = zeros(Int, nnzA) J = zeros(Int, nnzA) diff --git a/base/sparse/sparsematrix.jl b/base/sparse/sparsematrix.jl index 836c463f667a6..be89b0e32bdd9 100644 --- a/base/sparse/sparsematrix.jl +++ b/base/sparse/sparsematrix.jl @@ -162,7 +162,7 @@ function convert{Tv,TvS,TiS}(::Type{SparseMatrixCSC{Tv}}, S::SparseMatrixCSC{TvS end end -function convert{Tv,Ti}(::Type{SparseMatrixCSC{Tv,Ti}}, M::Matrix) +function convert{Tv,Ti}(::Type{SparseMatrixCSC{Tv,Ti}}, M::AbstractMatrix) m, n = size(M) (I, J, V) = findnz(M) return sparse_IJ_sorted!(convert(Vector{Ti},I), @@ -231,7 +231,7 @@ sparse(a::Vector) = sparsevec(a) ## Construct a sparse matrix -sparse{Tv}(A::Matrix{Tv}) = convert(SparseMatrixCSC{Tv,Int}, A) +sparse{Tv}(A::AbstractMatrix{Tv}) = convert(SparseMatrixCSC{Tv,Int}, A) sparse(S::SparseMatrixCSC) = copy(S) diff --git a/doc/stdlib/arrays.rst b/doc/stdlib/arrays.rst index 2cb0b1e2c8fb2..1c7469a89f7f7 100644 --- a/doc/stdlib/arrays.rst +++ b/doc/stdlib/arrays.rst @@ -670,7 +670,7 @@ Sparse matrices support much of the same set of operations as dense matrices. Th .. function:: sparse(A) - Convert a dense matrix ``A`` into a sparse matrix. + Convert an AbstractMatrix ``A`` into a sparse matrix. .. function:: sparsevec(A) diff --git a/test/sparse.jl b/test/sparse.jl index ee053c155b4c1..b56d897a33acf 100644 --- a/test/sparse.jl +++ b/test/sparse.jl @@ -655,3 +655,15 @@ let S = sprand(10, 10, 0.1) @test_throws BoundsError S[[0,2,1], [1,2]] @test_throws BoundsError S[[2,1], [0,1,2]] end + +# Test that sparse / sparsevec constructors work for AbstractMatrix subtypes +let D = Diagonal(ones(10,10)), + sm = sparse(D), + sv = sparsevec(D) + + @test countnz(sm) == 10 + @test countnz(sv) == 10 + + @test countnz(sparse(Diagonal(Int[]))) == 0 + @test countnz(sparsevec(Diagonal(Int[]))) == 0 +end