I have a pointer to array of floats: arr = [a0, a1, a2, a3, ..., an]
. I want the result to be: result = [a0+a1, a0+a1, a2+a3, a2+a3, a4+a5, a4+a5, ...]
. Now I'm doing it with map()
function:
let multiArrayValue: MLMultiArray = someMulityArray
let pointer = (multiArrayValue.dataPointer).bindMemory(to: Float.self, capacity: multiArrayValue.count)
let sums = (0..<multiArrayValue.count/2).map { (index) -> [Float] in
let sum = pointer[index * 2] + pointer[index * 2 + 1]
return [sum, sum]
}.flatMap { $0 }
How to do it in an efficient way with Accelerate
framework?
EDIT: I do manage to get res = [a0+a1, a2+a3, a4+a5, ..., an+an]
:
let k = multiArrayValue.count/2
let n = vDSP_Length(k)
var res = [Float](repeating: 0, count: k)
vDSP_vadd(&pointer, vDSP_Stride(2),
&pointer+1, vDSP_Stride(2),
&res, vDSP_Stride(1),
n)
So now the remained question is how, with Accelerate
to get repeated values: [a1, a2, a3, ... an] => [a1, a1, a2, a2, ..., an, an]
The solution to this achieved in 2 steps. The key in both steps is to play with the strides. First just calculate the sums vector:
let k = multiArrayValue.count/2
let n = vDSP_Length(k)
var sums = [Float](repeating: 0, count: k)
vDSP_vadd(&pointer, vDSP_Stride(2),
&pointer+1, vDSP_Stride(2),
&sums, vDSP_Stride(1),
n)
Second step is to get the repeated sums:
var resSparse = [Float](repeating: 0.0, count: k * 2)
vDSP_vmax(pointerOpt, 2, &sums + 1, 2, &resSparse, 2, k)
var res = [Float](repeating: 0.0, count: k * 2)
catlas_saxpby(k * 2 - 1, 1.0, &resSparse, 1, 1.0, &res + 1, 1)
catlas_saxpby(k * 2, 1.0, &resSparse, 1, 1.0, &res, 1)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.