RangeHelpers
RangeHelpers.RangeHelpersRangeHelpers.anchorrangeRangeHelpers.asrangeRangeHelpers.bincentersRangeHelpers.binwallsRangeHelpers.indexofRangeHelpers.prolongRangeHelpers.rangeRangeHelpers.samegridRangeHelpers.searchsortedatRangeHelpers.subdivideRangeHelpers.symrange
RangeHelpers.RangeHelpers — ModuleRangeHelpers
Ever needed a range with startpoint 10, endpoint 121.7 and a step of 25? Well that is mathematically not possible, so you need to compromise. There are lots of options, you could relax the startpoint, endpoint or step. In the past doing this was annoying and prone to off-by-one-errors:
julia> Base.range(10, step=25, length=round(Int, (121.7-10)/25)); # is it correct??RangeHelpers.jl aims to solve range construction headaches once and for all:
julia> using RangeHelpers: range
julia> using RangeHelpers
julia> range(start=10, stop=121.7, step=around(25)) # compromise on step
10.0:27.925:121.7
julia> range(start=10, stop=121.7, step=below(25)) # compromise step at most 25
10.0:22.34:121.7
julia> range(start=10, stop=above(121.7), step=25) # exact step, but allow bigger endpoint
10:25:135
julia> anchorrange(42, start=around(10), step=25, stop=around(121.7)) # make sure 42 is on the grid
17:25:117See the documentation for even more ways to make ranges.
RangeHelpers.anchorrange — Methodanchorrange(anchor; step, start, stop, pre, post)Return a range, that approximately has anchor on its grid.
julia> using RangeHelpers
julia> anchorrange(15.5, start=above(11), step=2, stop=below(15))
11.5:2.0:13.5RangeHelpers.asrange — Functionasrange(itr; check=true, atol, rtol)::AbstractRangeConvert itr into a range, optionally validating the result.
julia> using RangeHelpers
julia> asrange([1,2,3.0])
1.0:1.0:3.0
julia> asrange([1,2,3])
1:1:3
julia> asrange(1:3)
1:3
julia> asrange([1,2,4.0])
ERROR: ArgumentError: Cannot construct range from `itr`
itr = [1.0, 2.0, 4.0]
[...]
julia> asrange([1,2,4.0], atol=10)
1.0:1.5:4.0RangeHelpers.bincenters — Methodbincenters(r::AbstractRange)::AbstractRangeIf r is interpreted as a collection of bin boundaries, bincenters returns the bin centers.
julia> using RangeHelpers: bincenters
julia> bincenters(1:10.0)
1.5:1.0:9.5See also binwalls.
RangeHelpers.binwalls — Methodbinwalls(r::AbstractRange; first=true, last=true)::AbstractRangeIf r is interpreted as a collection of bin centers, binwalls returns the bin boundaries.
julia> using RangeHelpers: binwalls
julia> binwalls(0.0:2.0:10.0)
-1.0:2.0:11.0
julia> binwalls(0.0:2.0:10.0, first=false)
1.0:2.0:11.0
julia> binwalls(0.0:2.0:10.0, last=false)
-1.0:2.0:9.0See also bincenters.
RangeHelpers.indexof — Methodi = indexof(r::AbstractRange, x)Return i such that r[i] == x or throw an error if that is not possible.
RangeHelpers.prolong — Methodprolong(r::AbstractRange;start=nothing, stop=nothing, pre=nothing, post=nothing)Prolong an existing range r according to the arguments:
julia> using RangeHelpers
julia> r = 1.0:0.5:3.0
1.0:0.5:3.0
julia> prolong(r, stop=around(4))
1.0:0.5:4.0
julia> prolong(r, pre=1)
0.5:0.5:3.0
julia> prolong(r, pre=1, post=2)
0.5:0.5:4.0
julia> prolong(r, start=below(0.4), stop=around(4.1))
0.0:0.5:4.0RangeHelpers.range — Functionrange(start, stop; length, step)
range(start; stop, length, step)
range(;start, stop, length, step)Construct a range from the arguments. Three arguments must be given.
julia> using RangeHelpers
julia> using RangeHelpers: range
julia> range(start=1, stop=3, length=3)
1.0:1.0:3.0
julia> range(start=1, stop=3.1, step=around(1))
1.0:1.05:3.1
julia> range(start=1, stop=around(3.1), step=1)
1:1:3
julia> range(start=1, stop=above(3.1), step=1)
1:1:4
julia> range(start=1, stop=above(3.0), step=1)
1:1:3
julia> range(start=around(0.9), stop=3.0, step=1)
1.0:1.0:3.0
julia> range(start=strictbelow(1.0), stop=3.0, step=1)
0.0:1.0:3.0See also the docs of Base.range.
RangeHelpers.samegrid — Methodsamegrid(r1::AbstractRange, r2::AbstractRange; atol=0, rtol=0, kw...)::BoolCheck if r1 and r2 are defined on the same grid. That is if there exist equal prolongations of r1 and r1.
julia> using RangeHelpers: samegrid
julia> samegrid(1:10, 11:12)
true
julia> samegrid(1:10, 11:1.1:12)
false
julia> samegrid(1:10, 1:0)
true
julia> samegrid(1:10, 0.1:0)
false
julia> samegrid(1:10, 5:-1:3)
true
julia> samegrid(1:10, 4.1:1:5, rtol=0.2)
true
RangeHelpers.searchsortedat — Methodsearchsortedat(coll, x)Return the index of a sorted collection coll whose corresponding element is closest to x. If coll is not sorted, searchsortedat might silently return a wrong result.
julia> using RangeHelpers
julia> searchsortedat(100:100:1000, around(200))
2
julia> searchsortedat(100:100:1000, around(249))
2
julia> searchsortedat(100:100:1000, around(251))
3
julia> searchsortedat(100:100:1000, below(251))
2
julia> searchsortedat(100:100:1000, above(249))
3
julia> searchsortedat(100:100:1000, 300)
3
julia> searchsortedat(100:100:1000, 301)
ERROR: ArgumentError: coll does not contain x:
coll = 100:100:1000
x = 301
Try `searchsortedat(coll, around(x))`RangeHelpers.subdivide — Methodsubdivide(r::AbstractRange, factor::Integer, mode=:walls)Create a range with smaller step from r. Possible values for mode are (:walls, :centers).
julia> using RangeHelpers
julia> r = 1:3.0
1.0:1.0:3.0
julia> subdivide(r, 2)
1.0:0.5:3.0
julia> subdivide(r, 4)
1.0:0.25:3.0
julia> subdivide(r, 2, mode=:walls)
1.0:0.5:3.0
julia> subdivide(r, 2, mode=:centers)
0.75:0.5:3.25
julia> subdivide(r, 10, mode=:centers)
0.55:0.1:3.45RangeHelpers.symrange — Methodsymrange(;center=0, step, length, start, stop)Construct a range, that is symmetric around center.
julia> using RangeHelpers
julia> symrange(length=2, step=1)
-0.5:1.0:0.5
julia> symrange(length=3, step=1)
-1.0:1.0:1.0
julia> symrange(length=3, step=1, center=4)
3.0:1.0:5.0
julia> symrange(start=around(-4.1), step=2)
-4.0:2.0:4.0
julia> symrange(start=around(-4.1), step=2, center=1)
-4.0:2.0:6.0
julia> symrange(stop=around(4.1), step=2, center=1)
-2.0:2.0:4.0