@@ -2205,7 +2205,7 @@ end
22052205import Base. _one
22062206function Base. _one (unit:: T , S:: AbstractSparseMatrixCSC ) where T
22072207 size (S, 1 ) == size (S, 2 ) || throw (DimensionMismatch (" multiplicative identity only defined for square matrices" ))
2208- return SparseMatrixCSC {T} (I , size (S, 1 ), size (S, 2 ))
2208+ return _spscaling (T, Int, unit , size (S, 1 ), size (S, 2 ))
22092209end
22102210
22112211# # SparseMatrixCSC construction from UniformScaling
@@ -2217,13 +2217,19 @@ SparseMatrixCSC(s::UniformScaling, dims::Dims{2}) = SparseMatrixCSC{eltype(s)}(s
22172217function SparseMatrixCSC {Tv,Ti} (s:: UniformScaling , dims:: Dims{2} ) where {Tv,Ti}
22182218 @boundscheck first (dims) < 0 && throw (ArgumentError (" first dimension invalid ($(first (dims)) < 0)" ))
22192219 @boundscheck last (dims) < 0 && throw (ArgumentError (" second dimension invalid ($(last (dims)) < 0)" ))
2220- iszero (s. λ) && return spzeros (Tv, Ti, dims... )
2221- m, n, k = dims... , min (dims... )
2222- nzval = fill! (Vector {Tv} (undef, k), Tv (s. λ))
2220+ return _spscaling (Tv, Ti, s. λ, dims... )
2221+ end
2222+
2223+ function _spscaling (:: Type{Tv} , :: Type{Ti} , λ, m, n) where {Tv,Ti<: Integer }
2224+ iszero (λ) && return spzeros (Tv, Ti, m, n)
2225+ k = min (m, n)
2226+ nzval = fill! (Vector {Tv} (undef, k), Tv (λ))
22232227 rowval = copyto! (Vector {Ti} (undef, k), 1 : k)
22242228 colptr = copyto! (Vector {Ti} (undef, n + 1 ), 1 : (k + 1 ))
2225- for i in (k + 2 ): (n + 1 ) colptr[i] = (k + 1 ) end
2226- SparseMatrixCSC {Tv,Ti} (dims... , colptr, rowval, nzval)
2229+ for i in (k + 2 ): (n + 1 )
2230+ colptr[i] = (k + 1 )
2231+ end
2232+ return SparseMatrixCSC {Tv,Ti} (m, n, colptr, rowval, nzval)
22272233end
22282234
22292235Base. iszero (A:: AbstractSparseMatrixCSC ) = iszero (nzvalview (A))
0 commit comments