我有一个数组,我想要每个第n个元素的平均值,从特定元素开始(在这种情况下,每4个元素,从1开始)。最快的方法是什么?
我当前的方法是带有循环开关语句的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 :(得分:1)
我不明白你的评论中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)
答案 1 :(得分:0)
数组不能使用序列作为下标,但你可以用不同的方式编写
let mean4th = stride(from: 0, to: num_array.count-1, by: 4).reduce(0) {$0 + num_array[$1] } / (num_array.count / 4)
使用索引(Code Different)的想法是在正确的轨道上,但是在非常大的数组上,构建临时索引数组会增加处理时间(在500K元素数组上增加5倍)
我在500K(在操场上)上MacBook Pro的时间是0.41毫秒,远低于60Hz所需的16.7毫秒。你可能正在做的只是这个平均计算,所以越快越好。