That's a great solution. I think the only other alternative would be to
return an array instead of a range, which would be unfortunate.
On Wednesday, July 2, 2014 9:50:34 AM UTC-4, Ivar Nesje wrote:
>
> Hmm... Everything with floating point ranges is inherently difficult,
> because we want to give users the full accuracy (not cheat like Matlab
> does).
>
> In order for the slicing behaviour to be exactly right, it seems to me
> that we would need to store a start and a step increment, so that the
> calculation for all the indexed values becomes unchanged when the range is
> indexed with a range.
>
> Maybe we could have a Offset type that could wrap the FloatRange (and
> other objects too)
>
> immutable Offset{T}
> itr::T
> start::Int
> step::Int
> end
>
> function getindex(o::Offset, i::Int)
> getindex(o.itr, start+i*step)
> end
>
> Ivar
>
> kl. 15:11:18 UTC+2 onsdag 2. juli 2014 skrev Peter Simon følgende:
>>
>> Thanks. I had mistakenly thought that linrange would retain the exact
>> value of its end points, as does linspace.
>>
>> My actual application is to reproduce the functionality of Matlab's
>> optional histc output:
>>
>> [n,bin] = histc(x, edges)
>>
>>
>> Here, (using Matlab notation), bin is an integer-valued vector of the
>> same length as x such that bin(i) indicates which "bin" of edges is
>> occupied by x(i). My Julian attempt at reproducing this function used a
>> range named edges:
>>
>> edges = linrange(minimum(x), maximum(x), 20)
>> bin = [find(edges[1:end-1] .<= t .<= edges[2:end])[1] for t in x]
>>
>>
>>
>> and it failed due to the issue demonstrated in my first post. I think
>> that I could use linspace instead of linrange, but for other reasons a
>> range is preferable in this application. Do we already have this binning
>> functionality in some other built-in function? I checked Julia's hist(),
>> but it provides only the first output of Matlab's bin.
>>
>> Thanks,
>> --Peter
>>
>> On Tuesday, July 1, 2014 11:59:44 PM UTC-7, Ivar Nesje wrote:
>>>
>>> It is not a shocker to me. The problem is that Floating point numbers
>>> represent binary fractions, and there is no way for linrange() to actually
>>> get equidistant values you are looking for. It has to do approximations,
>>> and thus it will sometimes miss closest possible value. That means equality
>>> checks on floating point numbers should be used with extreme care.
>>>
>>> Our implementation reuses the old step size when indexing a FloatRange
>>> with a range, but we could probably do better if we tried to keep the last
>>> point equal.
>>>
>>> I reopened https://github.com/JuliaLang/julia/issues/7420 to keep track
>>> of this issue.
>>>
>>> Ivar
>>>
>>> kl. 07:07:25 UTC+2 onsdag 2. juli 2014 skrev Peter Simon følgende:
>>>>
>>>> The final result below seems really strange to me. A bug?
>>>>
>>>> julia> x = linrange(1,10,20)
>>>> 1.0:0.47368421052631576:10.0
>>>>
>>>>
>>>> julia> 10 .<= x # Gives expected result
>>>> 20-element BitArray{1}:
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> true
>>>>
>>>> julia> 10 .<= x[end] # Gives expected result
>>>> true
>>>>
>>>> julia> 10 .<= x[2:end] # The last entry in this result is a shocker
>>>> to me!
>>>> 19-element BitArray{1}:
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>> false
>>>>
>>>>
>>>>
>>>> Here is the version info:
>>>>
>>>>
>>>> julia> versioninfo()
>>>> Julia Version 0.3.0-prerelease+3987
>>>> Commit 7dd97fa (2014-06-30 23:12 UTC)
>>>> Platform Info:
>>>> System: Windows (x86_64-w64-mingw32)
>>>> CPU: Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz
>>>> WORD_SIZE: 64
>>>> BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY)
>>>> LAPACK: libopenblas
>>>> LIBM: libopenlibm
>>>>
>>>>