【问题标题】:What is fastest way to group array elements into buckets in iOS?在iOS中将数组元素分组到存储桶中的最快方法是什么?
【发布时间】:2013-01-20 23:36:09
【问题描述】:

所以我有一个包含 500,000 个元素的数组:

float* arrayToBucketize=(float*) malloc(sizeof(float)*500000);

还有一个代表桶的数组:

int buckets[5]={0,25,50,75,100};

通过第一个数组的最快方法是什么,查看每个浮点值,将其与“buckets”数组进行比较,然后用最接近的桶值替换该浮点值。因此,如果浮点值为 11.25,它将被替换为 0。另一方面,90.10 将被替换为 100。

另外,我需要该范围之外的任何值(100)保持不变。

我知道我可以使用 for 循环和 if 条件来做到这一点;但是在优化的坏习惯中,我试图找到一种更有效(更快)的方式来做到这一点。我希望 Accelerate 框架中有一个 C 函数或 iOS 函数可以做到这一点。或者可能是一系列 Accelerate 框架矩阵函数。

谢谢

【问题讨论】:

  • 您的存储桶是否始终像您的示例一样均匀分布?
  • 是的。也许不同的数字,但你可以假设它们是彼此的倍数(0,50,100,150,200)等等......谢谢
  • 好吧,我找不到任何矢量化比较方法。但是对于桶范围内的值,你可以除以最小公倍数,四舍五入,然后乘以相同的数字。加速框架具有矢量化的乘法、除法和舍入方法。使用您的示例,11.25/25 = 0.45,将四舍五入为 0,90.10/25 = 3.604,将四舍五入为 4。再次乘以 25 将为您提供所需的结果。
  • 杰夫,这行得通。你能把它放在一个答案中,以便我可以检查作为答案。

标签: ios c arrays histogram accelerate-framework


【解决方案1】:

对于存储桶范围内的每个值,除以存储桶值的最小公倍数。将结果四舍五入到最接近的整数,然后再乘以最小公倍数。

使用示例数字:

11.25 / 25 = 0.45
0.45 -> 0
0 * 25 = 0

90.10 / 25 = 3.604
3.604 -> 4
4 * 25 = 100

Accelerate 框架具有矢量化除法、舍入和乘法函数,因此它们应该运行得相当快。

【讨论】:

    猜你喜欢
    • 2015-02-23
    • 2016-12-20
    • 1970-01-01
    • 2016-08-29
    • 2013-03-13
    • 2011-01-19
    • 1970-01-01
    • 2011-11-21
    • 2019-07-07
    相关资源
    最近更新 更多