问题: 我希望找到类似于R中的findInterval函数,它接受一个标量和表示区间起点的向量作为输入,并返回标量所属的区间索引。例如在R中:
findInterval(x = 2.6, vec = c(1.1,2.1,3.1,4.1))
#[1] 2
在这个讨论中,有人提供了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不在向量中,因为它(据我理解)是要匹配值而不是将标量放入区间。
上面引用链接的函数(我更改了输入\输出数据类型)
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上的其他问题寻找在输入值和向量之间找到精确匹配的索引:
searchsortedlast
将实现您想要的功能,尽管您可能希望将其包装在自己的函数中,以检查返回值是否为0
或length(vec)
并在输入x
小于(或大于)vec
中的每个元素时执行您想要的任何行为。 - Colin T Bowerssearchsortedlast([1.1, 2.1, 3.1, 4.1], 2.6)
可以完成任务。 - Stuart