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()
    }
}