diff --git a/stdlib/SparseArrays/src/sparsematrix.jl b/stdlib/SparseArrays/src/sparsematrix.jl index ea8a8f0b442e2..da08e8a72981c 100644 --- a/stdlib/SparseArrays/src/sparsematrix.jl +++ b/stdlib/SparseArrays/src/sparsematrix.jl @@ -563,6 +563,8 @@ SparseMatrixCSC(M::Matrix) = sparse(M) SparseMatrixCSC(T::Tridiagonal{Tv}) where Tv = SparseMatrixCSC{Tv,Int}(T) function SparseMatrixCSC{Tv,Ti}(T::Tridiagonal) where {Tv,Ti} m = length(T.d) + m == 0 && return SparseMatrixCSC{Tv,Ti}(0, 0, ones(Ti, 1), Ti[], Tv[]) + m == 1 && return SparseMatrixCSC{Tv,Ti}(1, 1, Ti[1, 2], Ti[1], Tv[T.d[1]]) colptr = Vector{Ti}(undef, m+1) colptr[1] = 1 @@ -593,6 +595,8 @@ end SparseMatrixCSC(T::SymTridiagonal{Tv}) where Tv = SparseMatrixCSC{Tv,Int}(T) function SparseMatrixCSC{Tv,Ti}(T::SymTridiagonal) where {Tv,Ti} m = length(T.dv) + m == 0 && return SparseMatrixCSC{Tv,Ti}(0, 0, ones(Ti, 1), Ti[], Tv[]) + m == 1 && return SparseMatrixCSC{Tv,Ti}(1, 1, Ti[1, 2], Ti[1], Tv[T.dv[1]]) colptr = Vector{Ti}(undef, m+1) colptr[1] = 1 @@ -623,7 +627,7 @@ end SparseMatrixCSC(B::Bidiagonal{Tv}) where Tv = SparseMatrixCSC{Tv,Int}(B) function SparseMatrixCSC{Tv,Ti}(B::Bidiagonal) where {Tv,Ti} m = length(B.dv) - m == 0 && return SparseMatrixCSC{Tv,Ti}(zeros(Tv, 0, 0)) + m == 0 && return SparseMatrixCSC{Tv,Ti}(0, 0, ones(Ti, 1), Ti[], Tv[]) colptr = Vector{Ti}(undef, m+1) colptr[1] = 1 @@ -652,7 +656,7 @@ end SparseMatrixCSC(D::Diagonal{Tv}) where Tv = SparseMatrixCSC{Tv,Int}(D) function SparseMatrixCSC{Tv,Ti}(D::Diagonal) where {Tv,Ti} m = length(D.diag) - return SparseMatrixCSC(m, m, Vector(1:(m+1)), Vector(1:m), Vector{Tv}(D.diag)) + return SparseMatrixCSC(m, m, Vector(Ti(1):Ti(m+1)), Vector(Ti(1):Ti(m)), Vector{Tv}(D.diag)) end SparseMatrixCSC(M::AbstractMatrix{Tv}) where {Tv} = SparseMatrixCSC{Tv,Int}(M) SparseMatrixCSC{Tv}(M::AbstractMatrix{Tv}) where {Tv} = SparseMatrixCSC{Tv,Int}(M) diff --git a/stdlib/SparseArrays/test/sparse.jl b/stdlib/SparseArrays/test/sparse.jl index 128bb4735f063..ff955e967b433 100644 --- a/stdlib/SparseArrays/test/sparse.jl +++ b/stdlib/SparseArrays/test/sparse.jl @@ -1697,6 +1697,33 @@ end S2 = SparseMatrixCSC(D) @test Array(D) == Array(S) == Array(S2) @test S == S2 + + # An issue discovered in #42574 where + # SparseMatrixCSC{Tv, Ti}(::Diagonal) ignored Ti + D = Diagonal(rand(3)) + S = SparseMatrixCSC{Float64, Int8}(D) + @test S isa SparseMatrixCSC{Float64, Int8} +end + +@testset "Sparse construction with empty/1x1 structured matrices" begin + empty = spzeros(0, 0) + + @test sparse(Diagonal(zeros(0, 0))) == empty + @test sparse(Bidiagonal(zeros(0, 0), :U)) == empty + @test sparse(Bidiagonal(zeros(0, 0), :L)) == empty + @test sparse(SymTridiagonal(zeros(0, 0))) == empty + @test sparse(Tridiagonal(zeros(0, 0))) == empty + + one_by_one = rand(1,1) + sp_one_by_one = sparse(one_by_one) + + @test sparse(Diagonal(one_by_one)) == sp_one_by_one + @test sparse(Bidiagonal(one_by_one, :U)) == sp_one_by_one + @test sparse(Bidiagonal(one_by_one, :L)) == sp_one_by_one + @test sparse(Tridiagonal(one_by_one)) == sp_one_by_one + + s = SymTridiagonal(rand(1), rand(0)) + @test sparse(s) == s end @testset "error conditions for reshape, and dropdims" begin