Created
July 30, 2022 02:17
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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