朱莉娅语言:findInterval

时间:2016-05-21 20:59:26

标签: julia

问题:我希望在R中找到像findInterval这样的函数,它给输入一个标量和一个表示间隔起始点的向量,并返回标量落入的间隔的索引。例如在R:

findInterval(x = 2.6, vec = c(1.1,2.1,3.1,4.1))
#[1] 2

this exchange中,有人在Julia中提供了执行此功能的功能(请参阅下一节)。显然,基础indexin函数执行此任务。我想知道如何获得indexin函数(或其他基函数)来执行此操作。我知道Julia循环很快,我可以写一个函数但是如果有一个内置函数我宁愿不这样做,这应该是一个常见的问题。

当我尝试使用与上面R中使用的相同数字的indexin函数时,我得到:

indexin([2.6], [1.1 2.1 3.1 4.1])
# 1-element Array{Int64,1}:
# 0

这只是表明2.6不在向量中,因为它(据我所知)正在寻找匹配值而不是在一个区间内放置一个缩放器。

来自上述参考链接的函数(我对input \ output数据类型的更改)

function findInterval(x::Float64,vec::Array{Float64})
    out = zeros(Int,length(x))
    vec = unique(vec)
    sort!(vec)

    for j in 1:length(x)
        if x[j] < vec[1]
            out[1] = 0
        elseif x[j] > vec[end]
            out[end] = 0
        else
            out[j] = searchsortedfirst(vec,x[j])-1 
        end
    end
    return out
end

符合预期:

findInterval(2.6, [1.1 2.1 3.1 4.1])
# 1-element Array{Int64,1}:
# 2

来自SO的相关问题:关于SO的其他问题寻找找到输入值和向量之间完全匹配的索引:

1 个答案:

答案 0 :(得分:1)

如果您的输入向量始终排序,那么searchsortedlast将执行您想要的操作,例如

vec = [1.1, 2.1, 3.1, 4.1]
x = 2.6
searchsortedlast(vec, x)

但请注意,如果searchsortedlast,则0将返回x < vec[1],如果length(vec),则会返回x > vec[end]。因此,您可能希望编写自己的自定义行为来检查这些结果,例如:如果您希望0如果x不在vec中的任何时间间隔内,则始终返回function find_interval(vec, x) i = searchsortedlast(vec, x) i == length(vec) && (i = 0) return(i) end ,您可以写信:

METADATA

此外,如果您使用已排序的向量进行大量工作,您可能会对我在Julia中为已排序的向量编写的包感兴趣,但从未接触到添加到SortedVectorsElementName包的来源为here