Skip to content

Commit 7f53d66

Browse files
committed
Make length(A.nzval)==nnz(A) #30662
1 parent 7ee9cf8 commit 7f53d66

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

stdlib/SparseArrays/src/sparsematrix.jl

+7-3
Original file line numberDiff line numberDiff line change
@@ -339,9 +339,13 @@ function _sparsesimilar(S::SparseMatrixCSC, ::Type{TvNew}, ::Type{TiNew}) where
339339
newrowval = copyto!(similar(S.rowval, TiNew), S.rowval)
340340
return SparseMatrixCSC(S.m, S.n, newcolptr, newrowval, similar(S.nzval, TvNew))
341341
end
342-
# parent methods for similar that preserves only storage space (for when new and old dims differ)
343-
_sparsesimilar(S::SparseMatrixCSC, ::Type{TvNew}, ::Type{TiNew}, dims::Dims{2}) where {TvNew,TiNew} =
344-
SparseMatrixCSC(dims..., fill(one(TiNew), last(dims)+1), similar(S.rowval, TiNew), similar(S.nzval, TvNew))
342+
# parent methods for similar that preserves only storage space allocation (for when new and old dims differ)
343+
function _sparsesimilar(S::SparseMatrixCSC, ::Type{TvNew}, ::Type{TiNew}, dims::Dims{2}) where {TvNew,TiNew}
344+
S1=spzeros(TvNew, TiNew, dims...)
345+
sizehint!(S1.rowval, min(length(S.rowval), length(S1)))
346+
sizehint!(S1.nzval, min(length(S.nzval), length(S1)))
347+
return S1
348+
end
345349
# parent method for similar that allocates an empty sparse vector (when new dims are single)
346350
_sparsesimilar(S::SparseMatrixCSC, ::Type{TvNew}, ::Type{TiNew}, dims::Dims{1}) where {TvNew,TiNew} =
347351
SparseVector(dims..., similar(S.rowval, TiNew, 0), similar(S.nzval, TvNew, 0))

stdlib/SparseArrays/test/sparse.jl

+6-6
Original file line numberDiff line numberDiff line change
@@ -2188,22 +2188,22 @@ end
21882188
@test typeof(simA) == typeof(A)
21892189
@test size(simA) == (6,6)
21902190
@test simA.colptr == fill(1, 6+1)
2191-
@test length(simA.rowval) == length(A.rowval)
2192-
@test length(simA.nzval) == length(A.nzval)
2191+
@test length(simA.rowval) == 0
2192+
@test length(simA.nzval) == 0
21932193
# test similar with entry type and Dims{2} specification (preserves storage space only)
21942194
simA = similar(A, Float32, (6,6))
21952195
@test typeof(simA) == SparseMatrixCSC{Float32,eltype(A.colptr)}
21962196
@test size(simA) == (6,6)
21972197
@test simA.colptr == fill(1, 6+1)
2198-
@test length(simA.rowval) == length(A.rowval)
2199-
@test length(simA.nzval) == length(A.nzval)
2198+
@test length(simA.rowval) == 0
2199+
@test length(simA.nzval) == 0
22002200
# test similar with entry type, index type, and Dims{2} specification (preserves storage space only)
22012201
simA = similar(A, Float32, Int8, (6,6))
22022202
@test typeof(simA) == SparseMatrixCSC{Float32, Int8}
22032203
@test size(simA) == (6,6)
22042204
@test simA.colptr == fill(1, 6+1)
2205-
@test length(simA.rowval) == length(A.rowval)
2206-
@test length(simA.nzval) == length(A.nzval)
2205+
@test length(simA.rowval) == 0
2206+
@test length(simA.nzval) == 0
22072207
# test similar with Dims{1} specification (preserves nothing)
22082208
simA = similar(A, (6,))
22092209
@test typeof(simA) == SparseVector{eltype(A.nzval),eltype(A.colptr)}

0 commit comments

Comments
 (0)