Swift 对数组中的两个连续元素求和

Swift 对数组中的两个连续元素求和,swift,accelerate-framework,accelerate,Swift,Accelerate Framework,Accelerate,我有一个指向浮点数组的指针:arr=[a0,a1,a2,a3,…,an]。 我希望结果是:result=[a0+a1,a0+a1,a2+a3,a2+a3,a4+a5,a4+a5,…]。 现在我正在使用map()函数执行此操作: let multiArrayValue: MLMultiArray = someMulityArray let pointer = (multiArrayValue.dataPointer).bindMemory(to: Float.self, capacity: mul

我有一个指向浮点数组的指针:
arr=[a0,a1,a2,a3,…,an]
。 我希望结果是:
result=[a0+a1,a0+a1,a2+a3,a2+a3,a4+a5,a4+a5,…]
。 现在我正在使用
map()
函数执行此操作:

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 }

所以现在剩下的问题是,如何利用
加速
获得重复值:
[a1,a2,a3,…an]=>[a1,a1,a2,a2,…,an,an]
解决方案分两步实现。这两个步骤的关键都是配合步伐。首先,只需计算和向量:

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)
第二步是获得重复和:

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)

解决这个问题需要两个步骤。这两个步骤的关键都是配合步伐。首先,只需计算和向量:

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)
第二步是获得重复和:

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)

你真的需要在结果数组中重复求和吗?@MartinR我需要在计算的下一步重复它。@MartinR我刚刚设法得到了
res=[a0+a1,a2+a3,a4+a5,a4+a5,…]
。所以它可以是一个独立的问题:如何:
[a1,a2,a3,…an]=>[a1,a1,a2,a2,…,an,an]
关于你原来的问题,你可以尝试
让sums=ptr.index.map{ptr[$0&~1]+ptr[$0 | 1]}
,因为这样可以避免创建许多临时数组。就用吧。让flatMap=multiArrayValue.flatMap{Array(repeating:$0,count:2)}你真的需要在结果数组中重复求和吗?@MartinR我需要在计算的下一步中重复它。@MartinR我刚刚设法得到
res=[a0+a1,a2+a3,a4+a5,a4+a5,…]
。所以它可以是一个独立的问题:如何:
[a1,a2,a3,…an]=>[a1,a1,a2,a2,…,an,an]
关于你原来的问题,你可以尝试
让sums=ptr.index.map{ptr[$0&~1]+ptr[$0 | 1]}
,因为这样可以避免创建许多临时数组。就用吧。设flatMap=multiArrayValue.flatMap{Array(重复:$0,计数:2)}