diff --git a/README.md b/README.md index 92fdd31..a4bc4d4 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,9 @@ The package is structured as follows: - [x] `vDSP_vsortD` - Sort a vector - [x] `vDSP_vrampD` - Ramp a vector - [ ] `vDSP.sum` - Sum of a vector - - [ ] `vDSP.add` - Add two vectors + - [x] `vDSP.add`: + - [x] `vDSP.add` - Add two vectors + - [x] `vDSP.add` - Add a scalar to a vector - [ ] `vDSP.subtract` - Subtract two vectors - [ ] `vDSP.multiply` - Multiply two vectors - `Statistical` - Statistical operations: diff --git a/Sources/AccelerateLinux/VectorOps/vDSP+add.swift b/Sources/AccelerateLinux/VectorOps/vDSP+add.swift index 6e3e008..4cb51f9 100644 --- a/Sources/AccelerateLinux/VectorOps/vDSP+add.swift +++ b/Sources/AccelerateLinux/VectorOps/vDSP+add.swift @@ -23,6 +23,30 @@ extension vDSP { } } } + + /// Returns the double-precision element-wise sum of two vectors. + /// - Parameters: + /// - vectorA: The first input vector, A. + /// - vectorB: The second input vector, B. + /// - Returns: The output vector, C. + public static func add( + _ vectorA: T, + _ vectorB: U + ) -> [Double] where T: AccelerateBuffer, U: AccelerateBuffer, T.Element == Double, U.Element == Double { + precondition(vectorA.count == vectorB.count, "Vectors must have the same count.") + return .init(unsafeUninitializedCapacity: vectorA.count) { buffer, initializedCount in + vectorA.withUnsafeBufferPointer { vecAPtr in + vectorB.withUnsafeBufferPointer { vecBPtr in + var i = 0 + while i < vectorA.count { + buffer[i] = vecAPtr[i] + vecBPtr[i] + i += 1 + } + initializedCount = vectorA.count + } + } + } + } } #endif diff --git a/Tests/AccelerateLinuxTests/VectorTests/vDSP+addTests.swift b/Tests/AccelerateLinuxTests/VectorTests/vDSP+addTests.swift index 4824e54..c49ec93 100644 --- a/Tests/AccelerateLinuxTests/VectorTests/vDSP+addTests.swift +++ b/Tests/AccelerateLinuxTests/VectorTests/vDSP+addTests.swift @@ -12,4 +12,14 @@ struct vDSPaddTests { #expect(c == [11.0, 22.0, 33.0, 44.0, 55.0]) } + + @Test("vDSP.add vector + vector") + func vDSPaddVectorVector() { + let a: [Double] = [1, 2, 3, 4, 5] + let b: [Double] = [10, 20, 30, 40, 50] + + let c = vDSP.add(a, b) + + #expect(c == [11.0, 22.0, 33.0, 44.0, 55.0]) + } }