【发布时间】:2016-02-23 20:41:01
【问题描述】:
建议是逐步计算平均值 下面的代码是我发现计算增量平均值的最佳方法,以便将其用于大数字和/或大数组
下面是给这个数组加倍的例子
let values = [14.0,12.0, 23.4,37.5,11.46]
var index = 1
let avg = values.reduce(0.0) { return $0 + ( $1 - $0 ) / Double(index++) }
平均为 19.672。并且有效。
从你的角度来看是正确的吗?
有没有办法通过以下方式完成此操作:
let avg = values.averageIncr()
我不喜欢的是我必须使用和索引?
[更新]
更进一步,感谢@Martin R 的贡献
protocol NumericType:Equatable {
func +(lhs: Self, rhs: Self) -> Self
func -(lhs: Self, rhs: Self) -> Self
func /(lhs: Self, rhs: Self) -> Self
init(_ value : Int)
}
extension Double : NumericType { }
extension Array where Element : NumericType {
mutating func avg_inc_adding( element: Element, var startAvg:Element? = Element(0) ) throws -> Element{
if count > 0 && startAvg! == Element(0) {
startAvg = self.avg_inc()
}
append(element)
return startAvg! + (element - startAvg!) / Element(self.count - 1)
}
func avg_inc() -> Element {
return enumerate().reduce(Element(0)) { $0 + ( $1.1 - $0 ) / Element($1.0 + 1) }
}
}
通过这种方式,我可以执行以下操作:
var average:Double = values.avg_inc()
do {
average = try values.avg_inc_adding(34.6,startAvg: z)
}catch {
}
符合我的需要,我希望也能满足其他人的需要。
【问题讨论】:
-
谢谢,我会用这种方法提出这个逻辑。应该更好
-
@Leo:这不是stackoverflow.com/questions/28288148/… 的副本。这不是简单的平均计算,OP的问题是迭代步骤涉及到当前元素索引。我看不出在引用的线程中是如何解决这个问题的。