【问题标题】:Julia Language: findIntervalJulia 语言:findInterval
【发布时间】:2016-09-18 23:21:47
【问题描述】:

问题:我希望在 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 不在向量中,因为它(据我所知)正在寻找匹配值而不是在间隔中放置缩放器。

来自上述链接的函数(我对输入\输出数据类型的更改)

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 的其他问题寻找输入值和向量之间完全匹配的索引:

【问题讨论】:

  • 您是否希望在这里得到解答?还是您打算将findInterval 定义作为答案?如果是这样,如果您将其从问题部分中删除并将其作为您自己问题的答案发布,则会更清楚。还行吧!甚至鼓励! meta.stackoverflow.com/questions/250204/…
  • 嗨,马特,我正在寻找如何使用基本 Julia 函数执行类似 findInterval 函数的操作。根据上面的链接,应该有一种方法可以做到这一点,而无需编写自定义函数。
  • 如果你的输入向量总是排序的,那么searchsortedlast 会做你想做的事,尽管你可能想把它包装在你自己的函数中,检查0length(vec) 的返回和当输入 x 小于(或大于)vec 中的每个元素时,执行您想要的任何行为。
  • 嗨,谢谢@ColinTBowers。这很好用。 searchsortedlast( [1.1, 2.1, 3.1, 4.1], 2.6) 完成这项工作。
  • 没有问题。我会把它变成一个答案。

标签: julia


【解决方案1】:

如果你的输入向量总是排序的,那么searchsortedlast 会做你想做的事,例如

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

但是,请注意,如果 x &lt; vec[1]searchsortedlast 将返回 0,如果 x &gt; vec[end],将返回 length(vec)。因此,您可能想要编写自己的自定义行为来检查这些结果,例如如果你想总是返回0,如果x不在vec的任何区间内,你可以这样写:

function find_interval(vec, x)
    i = searchsortedlast(vec, x)
    i == length(vec) && (i = 0)
    return(i)
 end

另外,如果您经常使用排序向量,您可能会对我在 Julia 中为排序向量编写的包感兴趣,但一直没有时间添加到 METADATASortedVectors 包的来源是here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    相关资源
    最近更新 更多