2016-10-13 122 views
0

我有一个数组,我想从每个第四个元素(在这种情况下,每4个,从1开始)开始,每个第n个元素的平均值。什么是最快的方法来做到这一点?快速数组的每个第n个元素的平均值

我目前的方法是一个for循环与循环切换语句,但我想知道是否有一个更快的方法。

我想,如果这样的事情可以工作:

let num_array = [1,2,3,4,5,6,7,8] 
let mean4th = num_array[Array(stride(from: 1, to: num_array.count, by: 4))].reduce(0, +)/(num_array.count/4) 

希望能得到mean4th = 3(即(1 + 5)/ 2)

这将返回错误

Cannot subscript a value of type 'Array<UInt8>' with an index of type 'Array<Int>' 

。 。我正在努力避开

+0

为什么你想让它更快,更不可读?你必须每秒启动这个代码x次?这是一个有数千个数字的数组? – FredericP

+0

确实。我希望这可以运行在一个500k的元素阵列上,频率为60 Hz – Ian

+0

我目前用for循环得到的频率约为25 Hz – Ian

回答

0

我不明白你的意思是什么Hz在您的意见,但要做到这一点的方法之一是生成所有的元素,你要去参观,并从那里迭代指数:

let num_array = [1,2,3,4,5,6,7,8] 
let indices = Array(stride(from: 0, to: num_array.count, by: 4)) 

let mean = Double(indices.reduce(0) { $0 + num_array[$1] })/Double(indices.count) 
0

阵列不能使用序列作为它的下标,但你可以把它写不同

let mean4th = stride(from: 0, to: num_array.count-1, by: 4).reduce(0) {$0 + num_array[$1] }/(num_array.count/4) 

使用索引(代码不同)是在正确的轨道上,但在非常大的阵列,构建临时索引阵列增加了处理时间(一个500K元件阵列上的5倍以上)的想法

我在MacBook Pro上获得500K(在操场上)的时间是0.41毫秒,远低于60赫兹所需的16.7毫秒。你可能做得更多,只是这个平均的计算,尽管越快越好。