【问题标题】:How to determine what bin a float should be in? C++ [closed]如何确定浮动应该在哪个 bin 中? C++ [关闭]
【发布时间】:2013-02-07 23:44:02
【问题描述】:

我有一个浮点数组Float_t xbins[41],它定义了 40 个 bin,即浮点数范围。 例如。如果y > xbins[7] && !(y > xbins[8])y 在 bin 7 中。

如果没有 40 个 if 语句,我如何确定给定浮点数应属于哪个 bin?

请用 C++ 回答,因为我不会说其他语言。

【问题讨论】:

  • 我不知道你想要什么。
  • 你没有告诉我应该选择“bin”的标准,那么我们如何告诉你更好的方法来实现这些标准?
  • 每个 bin 的浮点数范围是多少?它们是完全任意的,还是可以简单地计算 bin 编号?
  • @JackAidley:如果您计算低于第一个边界和高于最后一个边界的值,则为 42 个 bin。 40,如果你不这样做。
  • 所以 binx[] 包含一个用于分箱的起点/终点数组?因此,对于任何x,您都想找到一个像xbins[n] <= x && xbins[n+1] > x 这样的职位?对吗?

标签: c++ arrays conditional


【解决方案1】:

如果数组已排序,则进行二进制搜索以找到正确的 bin。您需要 std::sort(如果未排序)和 std::lower_bound 之类的组合来定位。您需要确保为Float_t 正确实施operator<

【讨论】:

  • 谢谢,std::lower_bound 似乎是我需要的。
  • 这 41 个浮点数可以定义 40 个 bin 的唯一方法是对数组进行排序。
【解决方案2】:

事实证明,这些 bin 不是均匀间隔的,而是具有整数边界,可能最快的方法是使用一个(反向)查找表,该表显然有大约 100 个条目。基本上需要对下限和上限进行两次比较。

如果数组边界是通过公式得出的,则可以编写一个优于 LUT 方法的逆公式。

对于一般情况,二分搜索是一种方法——甚至可以通过进行线性插值而不是将范围精确地细分为一半来改善这一点。与二进制搜索的 O(logn) 相比,速度(如果数据不是病态的)将是 O(loglogn)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多