对数组中的 2 个连续元素求和
Posted
技术标签:
【中文标题】对数组中的 2 个连续元素求和【英文标题】:Sum 2 consecutive elements in an array 【发布时间】:2019-12-16 13:13:45 【问题描述】:我有一个指向浮点数组的指针: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
如何使用Accelerate
框架有效地做到这一点?
编辑:
我确实设法得到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)
所以现在剩下的问题是如何使用Accelerate
获得重复值:[a1, a2, a3, ... an] => [a1, a1, a2, a2, ..., an, an]
【问题讨论】:
你真的需要在结果数组中重复总和吗? @MartinR 我需要为下一步的计算重复它。 @MartinR 我刚刚设法得到res = [a0+a1, a2+a3, a4+a5, a4+a5, ...]
。所以它可以是一个单独的问题:如何:[a1, a2, a3, ... an] => [a1, a1, a2, a2, ..., an, an]
关于您的原始问题,您可以尝试let sums = ptr.indices.map ptr[$0 & ~1] + ptr[$0 | 1]
,因为这样可以避免创建许多临时数组。
来自苹果文档developer.apple.com/documentation/swift/sequence/…。只是使用。让 flatMapped = multiArrayValue.flatMap Array(repeating: $0, count: 2)
【参考方案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)
【讨论】:
以上是关于对数组中的 2 个连续元素求和的主要内容,如果未能解决你的问题,请参考以下文章