我需要一个低通滤波器在我的斯卡拉项目之一,本想出了:如何在斯卡拉
def filter(numbers: Seq[Double], filterSize: Int): Seq[Double] = {
assert(filterSize > 0)
val ringBuffer = new Array[Double](filterSize)
var ringBufferIndex = 0
numbers.map(x => {
// update ring buffer
ringBuffer(ringBufferIndex) = x
// increase ring index
ringBufferIndex += 1
if (ringBufferIndex == filterSize) {
ringBufferIndex = 0
}
// get avarage
ringBuffer.foldLeft(0.0)(_ + _)/filterSize
})
}
然而,有一些事情我不不喜欢它:
- 它使用映射(很好的功能),但需要一个可变的变量(ringBufferIndex - 坏)。
它的工作是
Seq[Double]
(这很好),但返回Seq[Double]
,这是不好的,因为它需要调用者调用.toList
或他实际使用的任何东西。我想在这里使用泛型这样的:def filter\[T <% Seq[Double]](numbers: T, filterSize: Int): T
但不会编译。
有没有人有建议如何改善这两个问题?
不知道关于zipWithIndex,谢谢。 – Lemmy 2009-01-24 17:40:18