diff --git a/base/array.jl b/base/array.jl index 1141b364e2c0a..83fd04c13ad72 100644 --- a/base/array.jl +++ b/base/array.jl @@ -2068,12 +2068,12 @@ function findmax(a) if isempty(a) throw(ArgumentError("collection must be non-empty")) end - s = start(a) - mi = i = 1 - m, s = next(a, s) - while !done(a, s) - ai, s = next(a, s) - i += 1 + p = pairs(a) + s = start(p) + (mi, m), s = next(p, s) + i = mi + while !done(p, s) + (i, ai), s = next(p, s) ai != ai && continue # assume x != x => x is a NaN if m != m || isless(m, ai) m = ai @@ -2108,12 +2108,12 @@ function findmin(a) if isempty(a) throw(ArgumentError("collection must be non-empty")) end - s = start(a) - mi = i = 1 - m, s = next(a, s) - while !done(a, s) - ai, s = next(a, s) - i += 1 + p = pairs(a) + s = start(p) + (mi, m), s = next(p, s) + i = mi + while !done(p, s) + (i, ai), s = next(p, s) ai != ai && continue if m != m || isless(ai, m) m = ai diff --git a/base/sparse/sparsematrix.jl b/base/sparse/sparsematrix.jl index e58530b4fb115..268480d7674c2 100644 --- a/base/sparse/sparsematrix.jl +++ b/base/sparse/sparsematrix.jl @@ -1905,8 +1905,8 @@ end findmin(A::SparseMatrixCSC{Tv,Ti}, region) where {Tv,Ti} = @_findr(<, A, region, Tv, Ti) findmax(A::SparseMatrixCSC{Tv,Ti}, region) where {Tv,Ti} = @_findr(>, A, region, Tv, Ti) -findmin(A::SparseMatrixCSC) = (r=findmin(A,(1,2)); (r[1][1], r[2][1])) -findmax(A::SparseMatrixCSC) = (r=findmax(A,(1,2)); (r[1][1], r[2][1])) +findmin(A::SparseMatrixCSC) = (r=findmin(A,(1,2)); (r[1][1], CartesianIndex(ind2sub(A, r[2][1])))) +findmax(A::SparseMatrixCSC) = (r=findmax(A,(1,2)); (r[1][1], CartesianIndex(ind2sub(A, r[2][1])))) indmin(A::SparseMatrixCSC) = findmin(A)[2] indmax(A::SparseMatrixCSC) = findmax(A)[2] diff --git a/test/arrayops.jl b/test/arrayops.jl index 0ffd86eeea572..3bfa8de9d5b80 100644 --- a/test/arrayops.jl +++ b/test/arrayops.jl @@ -497,7 +497,7 @@ end @test indmin(5:-2:1) == 3 #23094 - @test findmax(Set(["abc"])) === ("abc", 1) + @test_throws MethodError findmax(Set(["abc"])) @test findmin(["abc", "a"]) === ("a", 2) @test_throws MethodError findmax([Set([1]), Set([2])]) @test findmin([0.0, -0.0]) === (-0.0, 2) @@ -1811,6 +1811,11 @@ s, si = findmax(S) @test a == b == s @test ai == bi == si +for X in (A, B, S) + @test findmin(X) == findmin(Dict(pairs(X))) + @test findmax(X) == findmax(Dict(pairs(X))) +end + fill!(B, 2) @test all(x->x==2, B) diff --git a/test/sparse/sparse.jl b/test/sparse/sparse.jl index 741ef0de794a8..8ff7fcf108361 100644 --- a/test/sparse/sparse.jl +++ b/test/sparse/sparse.jl @@ -992,8 +992,8 @@ end S = spzeros(10,8) A = Array(S) - @test indmax(S) == indmax(A) == 1 - @test indmin(S) == indmin(A) == 1 + @test indmax(S) == indmax(A) == CartesianIndex(1,1) + @test indmin(S) == indmin(A) == CartesianIndex(1,1) A = Array{Int}(0,0) S = sparse(A)