Swift 中 Int 数组的示例变体
Sample variation for an array of Int in Swift
在此基础上 ,我正在尝试计算 Int 数组的方差。
到目前为止,我的扩展是这样的:
extension Array where Element: Integer {
/// Returns the sum of all elements in the array
var total: Element {
return reduce(0, combine: +)
}
/// Returns the average of all elements in the array
var average: Double {
return isEmpty ? 0 : Double(total.hashValue) / Double(count)
}
/// Returns an array of the squared deviations from the mean
var squaredDeviations: [Double] {
let mean = average
return isEmpty ? 0 : map( { number in
let difference = Double(number) - mean
return pow(distance, 2)
})
}
}
Total 和 average 工作正常,但对于 squaredDifferences,使用 map
时似乎必须 return 与数组类型相同。有办法解决这个问题吗?
更新 我收到编译器错误:
Result values in '? :" expression have mismatching types 'Int' and
'[ _ ]'
问题是我 returning 0 这不是双精度数组。另外我没有使用 number.hashValue,因此无法初始化 double。
这里的问题是您有两个可能的值可以返回:
return isEmpty ? 0 : map( { number in
let difference = Double(number) - mean
return pow(distance, 2)
})
让我们将这些 conditional
运算符分解为 if
/else
:
if isEmpty {
return 0 //inferred return type: Int
}
else {
return map( { number in
let difference = Double(number) - mean
return pow(distance, 2)
}) // inferred return type: [Double]
}
两种可能returns的类型不同。
方差是 平均值 与均值的 平方 差异。你忘了做平均步骤。尝试:
var squaredDeviations: Double {
let mean = average
return isEmpty ? 0.0 : self.map{ pow(Double([=12=]) - mean, 2) }.average
}
旁注:我建议不要使用计算属性来进行昂贵的计算。它呈现了一个误导性的 API,并没有明确表示这是一个缓慢的线性时间过程。以下是我的操作方法:
extension Array where Element: Integer {
/// Returns the sum of all elements in the array
func summed() -> Element {
return self.reduce(0, combine: +)
}
/// Returns the average of all elements in the array
func averaged() -> Double {
return Double(self.summed()) / Double(count)
}
/// Returns an array of the squared deviations from the mean
func squaredDeviations() -> [Double] {
let average = self.averaged()
return self.map { pow(Double([=13=]) - average, 2) }
}
/// Returns the variance of the Array
func variance() -> Double {
return self.squaredDeviations().averaged()
}
}
在此基础上
到目前为止,我的扩展是这样的:
extension Array where Element: Integer {
/// Returns the sum of all elements in the array
var total: Element {
return reduce(0, combine: +)
}
/// Returns the average of all elements in the array
var average: Double {
return isEmpty ? 0 : Double(total.hashValue) / Double(count)
}
/// Returns an array of the squared deviations from the mean
var squaredDeviations: [Double] {
let mean = average
return isEmpty ? 0 : map( { number in
let difference = Double(number) - mean
return pow(distance, 2)
})
}
}
Total 和 average 工作正常,但对于 squaredDifferences,使用 map
时似乎必须 return 与数组类型相同。有办法解决这个问题吗?
更新 我收到编译器错误:
Result values in '? :" expression have mismatching types 'Int' and '[ _ ]'
问题是我 returning 0 这不是双精度数组。另外我没有使用 number.hashValue,因此无法初始化 double。
这里的问题是您有两个可能的值可以返回:
return isEmpty ? 0 : map( { number in
let difference = Double(number) - mean
return pow(distance, 2)
})
让我们将这些 conditional
运算符分解为 if
/else
:
if isEmpty {
return 0 //inferred return type: Int
}
else {
return map( { number in
let difference = Double(number) - mean
return pow(distance, 2)
}) // inferred return type: [Double]
}
两种可能returns的类型不同。
方差是 平均值 与均值的 平方 差异。你忘了做平均步骤。尝试:
var squaredDeviations: Double {
let mean = average
return isEmpty ? 0.0 : self.map{ pow(Double([=12=]) - mean, 2) }.average
}
旁注:我建议不要使用计算属性来进行昂贵的计算。它呈现了一个误导性的 API,并没有明确表示这是一个缓慢的线性时间过程。以下是我的操作方法:
extension Array where Element: Integer {
/// Returns the sum of all elements in the array
func summed() -> Element {
return self.reduce(0, combine: +)
}
/// Returns the average of all elements in the array
func averaged() -> Double {
return Double(self.summed()) / Double(count)
}
/// Returns an array of the squared deviations from the mean
func squaredDeviations() -> [Double] {
let average = self.averaged()
return self.map { pow(Double([=13=]) - average, 2) }
}
/// Returns the variance of the Array
func variance() -> Double {
return self.squaredDeviations().averaged()
}
}