From 1db7b8f08cf04ea01aebc1b9c941b7f16d48a045 Mon Sep 17 00:00:00 2001 From: Fredrik Ekre Date: Tue, 22 Aug 2017 18:53:18 +0200 Subject: [PATCH] deprecate diagm(A::SparseMatrixCSC) in favor of spdiagm(sparsevec(A)) (#23341) * deprecate diagm(A::SparseMatrixCSC) in favor of diagm(sparsevec(A)) * use spdiagm instead --- NEWS.md | 3 +++ base/deprecated.jl | 3 +++ base/sparse/sparsematrix.jl | 43 ------------------------------------- test/sparse/sparse.jl | 10 ++++----- 4 files changed, 11 insertions(+), 48 deletions(-) diff --git a/NEWS.md b/NEWS.md index 3d8d2927676a4..d5fb7f049c57e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -326,6 +326,9 @@ Deprecated or removed * `Base.SparseArrays.SpDiagIterator` has been removed ([#23261]). + * `diagm(A::SparseMatrixCSC)` has been deprecated in favor of + `spdiagm(sparsevec(A))` ([#23341]). + Command-line option changes --------------------------- diff --git a/base/deprecated.jl b/base/deprecated.jl index ce59333032c4c..fa1bf8a1c14e9 100644 --- a/base/deprecated.jl +++ b/base/deprecated.jl @@ -1705,6 +1705,9 @@ export hex2num # issue #17886 # deprecations for filter[!] with 2-arg functions are in associative.jl +# PR 23341 +@deprecate diagm(A::SparseMatrixCSC) spdiagm(sparsevec(A)) + # END 0.7 deprecations # BEGIN 1.0 deprecations diff --git a/base/sparse/sparsematrix.jl b/base/sparse/sparsematrix.jl index 4bd62a54a25b8..e58530b4fb115 100644 --- a/base/sparse/sparsematrix.jl +++ b/base/sparse/sparsematrix.jl @@ -3413,49 +3413,6 @@ function trace(A::SparseMatrixCSC{Tv}) where Tv return s end -function diagm(v::SparseMatrixCSC{Tv,Ti}) where {Tv,Ti} - if size(v,1) != 1 && size(v,2) != 1 - throw(DimensionMismatch("input should be nx1 or 1xn")) - end - - n = length(v) - numnz = nnz(v) - colptr = Vector{Ti}(n+1) - rowval = Vector{Ti}(numnz) - nzval = Vector{Tv}(numnz) - - if size(v,1) == 1 - copy!(colptr, 1, v.colptr, 1, n+1) - ptr = 1 - for col = 1:n - if colptr[col] != colptr[col+1] - rowval[ptr] = col - nzval[ptr] = v.nzval[ptr] - ptr += 1 - end - end - else - copy!(rowval, 1, v.rowval, 1, numnz) - copy!(nzval, 1, v.nzval, 1, numnz) - colptr[1] = 1 - ptr = 1 - col = 1 - while col <= n && ptr <= numnz - while rowval[ptr] > col - colptr[col+1] = colptr[col] - col += 1 - end - colptr[col+1] = colptr[col] + 1 - ptr += 1 - col += 1 - end - if col <= n - colptr[(col+1):(n+1)] = colptr[col] - end - end - - return SparseMatrixCSC(n, n, colptr, rowval, nzval) -end # Sort all the indices in each column of a CSC sparse matrix # sortSparseMatrixCSC!(A, sortindices = :sortcols) # Sort each column with sort() diff --git a/test/sparse/sparse.jl b/test/sparse/sparse.jl index 8e43393ad1e61..30e62f354afab 100644 --- a/test/sparse/sparse.jl +++ b/test/sparse/sparse.jl @@ -1316,11 +1316,11 @@ end @test trace(speye(5)) == 5 end -@testset "diagm on a matrix" begin - @test_throws DimensionMismatch diagm(sparse(ones(5,2))) - @test_throws DimensionMismatch diagm(sparse(ones(2,5))) - @test diagm(sparse(ones(1,5))) == speye(5) - @test diagm(sparse(ones(5,1))) == speye(5) +@testset "spdiagm" begin + v = sprand(10, 0.4) + @test spdiagm(v)::SparseMatrixCSC == diagm(Vector(v)) + @test spdiagm(sparse(ones(5)))::SparseMatrixCSC == speye(5) + @test spdiagm(sparse(zeros(5)))::SparseMatrixCSC == spzeros(5,5) end @testset "diag" begin