Skip to content

Commit 95575c0

Browse files
authored
Speedup for findmin()/findmax() on sparse arrays (#510) (#511)
1 parent 4cc31f2 commit 95575c0

File tree

2 files changed

+9
-6
lines changed

2 files changed

+9
-6
lines changed

src/sparsematrix.jl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2629,7 +2629,7 @@ function _findz(A::AbstractSparseMatrixCSC{Tv,Ti}, rows=1:size(A, 1), cols=1:siz
26292629
return CartesianIndex(0, 0)
26302630
end
26312631

2632-
function _findr(op, A, region, Tv)
2632+
function _findr(op, A::AbstractSparseMatrixCSC{Tv}, region) where {Tv}
26332633
require_one_based_indexing(A)
26342634
Ti = eltype(keys(A))
26352635
i1 = first(keys(A))
@@ -2707,11 +2707,13 @@ _isless_fm(a, b) = b == b && ( a != a || isless(a, b) )
27072707
_isgreater_fm(a, b) = b == b && ( a != a || isless(b, a) )
27082708

27092709
findmin(A::AbstractSparseMatrixCSC{Tv}, region::Union{Integer,Tuple{Integer},NTuple{2,Integer}}) where {Tv} =
2710-
_findr(_isless_fm, A, region, Tv)
2710+
_findr(_isless_fm, A, region)
27112711
findmax(A::AbstractSparseMatrixCSC{Tv}, region::Union{Integer,Tuple{Integer},NTuple{2,Integer}}) where {Tv} =
2712-
_findr(_isgreater_fm, A, region, Tv)
2713-
findmin(A::AbstractSparseMatrixCSC) = (r=findmin(A,(1,2)); (r[1][1], r[2][1]))
2714-
findmax(A::AbstractSparseMatrixCSC) = (r=findmax(A,(1,2)); (r[1][1], r[2][1]))
2712+
_findr(_isgreater_fm, A, region)
2713+
findmin(A::AbstractSparseMatrixCSC; dims::Union{Nothing,Integer,Tuple{Integer},NTuple{2,Integer}} = nothing) =
2714+
isnothing(dims) ? (r = findmin(A, (1,2)); (r[1][1], r[2][1])) : findmin(A, dims)
2715+
findmax(A::AbstractSparseMatrixCSC; dims::Union{Nothing,Integer,Tuple{Integer},NTuple{2,Integer}} = nothing) =
2716+
isnothing(dims) ? (r = findmax(A, (1,2)); (r[1][1], r[2][1])) : findmax(A, dims)
27152717

27162718
argmin(A::AbstractSparseMatrixCSC) = findmin(A)[2]
27172719
argmax(A::AbstractSparseMatrixCSC) = findmax(A)[2]

test/sparsematrix_ops.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,8 @@ dA = Array(sA)
241241
@testset "empty cases" begin
242242
errchecker(str) = occursin(": reducing over an empty collection is not allowed", str) ||
243243
occursin(": reducing with ", str) ||
244-
occursin("collection slices must be non-empty", str)
244+
occursin("collection slices must be non-empty", str) ||
245+
occursin("array slices must be non-empty", str)
245246
@test sum(sparse(Int[])) === 0
246247
@test prod(sparse(Int[])) === 1
247248
@test_throws errchecker minimum(sparse(Int[]))

0 commit comments

Comments
 (0)