Skip to content

Instantly share code, notes, and snippets.

@carlynorama
Created July 30, 2022 02:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save carlynorama/ff55e82f0579dc7056d1efd36925a4c4 to your computer and use it in GitHub Desktop.
Save carlynorama/ff55e82f0579dc7056d1efd36925a4c4 to your computer and use it in GitHub Desktop.
linear equation solver from array of "DataPoints" a protocol that expects (x:Number, y:Number) tuple
//https://developer.apple.com/documentation/accelerate/working_with_matrices
// e.g. https://www.youtube.com/watch?v=wBxUa9tHkkE&list=PLMiyQ6EW11_lJT2YKm7kz_Uaa7M0LbBkP
typealias Number = Double
static func solveLinearPair(cx1:Number, cy1:Number, s1:Number, cx2:Number, cy2:Number, s2:Number) -> SIMD2<Number> {
let a = simd_double2x2(rows: [
simd_double2(cx1, cy1),
simd_double2(cx2, cy2)
])
let b = simd_double2(s1, s2)
return simd_mul(a.inverse, b)
}
public extension Array where Element == DataPoint {
func unzipDataPoints() -> (inputs:[Number], outputs:[Number]) {
var inputs = [Number]()
var results = [Number]()
inputs.reserveCapacity(count)
results.reserveCapacity(count)
forEach { dp in
inputs.append(dp.x)
results.append(dp.y)
}
return (inputs, results)
}
func findLine() -> (m:Number, b:Number) {
let splitData = self.unzipDataPoints()
let cx1_SigmaXk2:Number = splitData.inputs.sumOfSquares() //vDSP.sumOfSquares
let cy1_SigmaXk:Number = splitData.inputs.reduce(0, +)
let cx2_SigmaXk:Number = splitData.inputs.reduce(0, +)
let cy2_n:Number = Double(self.count) as Number
let xkyk = vDSP.multiply(splitData.inputs, splitData.outputs)
let s1_SigmaXkYk:Number = xkyk.reduce(0, +)
let s2_SigmaYk:Number = splitData.outputs.reduce(0, +)
let result = solveLinearPair(cx1: cx1_SigmaXk2, cy1: cy1_SigmaXk, s1: s1_SigmaXkYk, cx2: cx2_SigmaXk, cy2: cy2_n, s2: s2_SigmaYk)
return (result.x, result.y)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment