Scala中向量序列的总和

Bry*_*zer 5 scala scala-collections

我有一系列双打向量: val vectors = Seq[Vector[Double]]

我想对序列中的所有向量求和,即 val total = vectors.sum

例如,如果我有一个包含两个向量[1,2]和的序列[3,4],那么结果应该是[4,6]

但是,该类型的sum方法Vector需要一个隐式的Numeric.

我现在拥有的是:

val total = vectors.reduce( (one,two) => one.zip(two).map(tuple => tuple._1 + tuple._2) )
Run Code Online (Sandbox Code Playgroud)

我是 Scala 的新手,但我觉得这很令人困惑,我认为它可能效率低下。

有一个更好的方法吗?

Ram*_*gil 3

即使向量具有不同的长度,此尾递归函数也将起作用,并且可以应用于任何数字类型:

@scala.annotation.tailrec
def recSum[T : Numeric](s : Iterable[Iterable[T]]) : List[T] = {
  val goodVecs = s.filterNot(_.isEmpty)

  if(goodVecs.isEmpty) 
    List.empty[T]
  else 
    goodVecs.map(_.head).sum :: recSum(goodVecs.map(_.tail))
}
Run Code Online (Sandbox Code Playgroud)

将其应用到您的示例中:

recSum(Seq(Vector(1.0,2.0), Vector(3.0,4.0,5.0))) //List(4.0,6.0,5.0)

recSum(Seq.empty[Vector[Double]]) // List()
Run Code Online (Sandbox Code Playgroud)