diff --git a/src/sparsevector.jl b/src/sparsevector.jl index 1f3d0793..e17ae607 100644 --- a/src/sparsevector.jl +++ b/src/sparsevector.jl @@ -1434,7 +1434,12 @@ for (fun, comp, word) in ((:findmin, :(<), "minimum"), (:findmax, :(>), "maximum # we try to avoid findfirst(iszero, x) sindex = findfirst(iszero, nzvals) # first stored zero, if any zindex = findfirst(i -> i < nzinds[i], eachindex(nzinds)) # first non-stored zero - index = isnothing(sindex) ? zindex : min(sindex, zindex) + index = if isnothing(sindex) + # non-stored zero are contiguous and at the end + isnothing(zindex) && last(nzinds) < lastindex(x) ? last(nzinds) + 1 : zindex + else + min(sindex, zindex) + end return zeroval, index end end diff --git a/test/sparsevector.jl b/test/sparsevector.jl index 6eaaba98..53b8060d 100644 --- a/test/sparsevector.jl +++ b/test/sparsevector.jl @@ -898,6 +898,24 @@ end @test_throws ArgumentError findmin(x) @test_throws ArgumentError findmax(x) end + + let v = spzeros(3) #Julia #44978 + v[1] = 2 + @test argmin(v) == 2 + @test argmax(v) == 1 + v[2] = 2 + @test argmin(v) == 3 + v[1] = 0 + v[2] = 0 + v[3] = 2 + @test argmin(v) == 1 + @test argmax(v) == 3 + end + + let v = spzeros(3) #Julia #44978 + v[3] = 2 + @test argmax(v) == 3 + end end ### linalg