センサの値なんかを平滑化するために移動平均を使おうと思って書いてみました。
extensionにしとくと便利かな?と思ってArrayのextensionにする形で書いてみました。
FloatingPointに準拠したArrayでのみ使えるように制限してあります。
extension Array where Element: FloatingPoint {
func simpleMovingAverage(scope:Int) -> [Element]? {
guard self.count >= scope else { return nil }
var result = [Element]()
for endIndex in scope...self.count {
let lower = endIndex-scope
let upper = endIndex
let range = Range(uncheckedBounds: (lower: lower, upper: upper))
let sum = self[range].reduce(0) { (v1, v2) -> Element in return v1+v2 }
let avg = sum/Element(scope)
result.append(avg)
}
return result
}
}