我有一组n个数字数组。我需要找到它们的均值和标准差。我想出了一种使用多重映射、折叠等方法的方法,但我想知道常规循环是否会更快。例如,对于I do的平均值:
mean = vectors.foldLeft(Array.ofDim[Double](dimensionality)) { (x, y) =>
(x zip y).map(z => z._1 + z._2)
}.map(_ / sampleSize)
}
这里对数组进行了两次运行,一次用于zip,另一次用于对它们求和的map。然而,在常规的for循环中,我只需要遍历每个数组一次就可以累加
值。标准差更大。到目前为止,我有一个很糟糕的方法
sd = vectors.map(x => {
(x zip _mean).map(z => Math.pow(z._1 - z._2, 2))
}).reduce((x, y) => {
(x zip y).map(z => z._1 + z._2)
}).map(z => z / sampleSize).map(Math.sqrt)
这里有许多运行(我认为即使在一个体面的解决方案中也会有一些)。对于常规的for循环,计算值和平均值之间的差值,然后累加值的步骤可以在每个数组的一次运行中完成。
有没有"Scala"如何实现这一点,还是循环更好?
从Scala"如果您使用2.13或.zipped
,如果您使用2.12而不是.zip
,则可以减少. lazyzip在数组上的运行次数。
(x lazyZip y).map(_ + _)
它与.zip
相同,只是在调用严格操作之前,每个集合中的元素都不会被消耗。因此,您将只运行一次。