我不明白你想做 100% 的数学,但我明白如何使用 Accelerate。我创建了一个函数,它可以更轻松地调用这个 Accelerate 函数并向您展示它是如何工作的。
/**
Vector linear interpolation between neighboring elements
- Parameter a: Input vector.
- Parameter b: Input vector: integer parts are indices into a and fractional parts are interpolation constants.
Performs the following operation:
```C
for (n = 0; n < N; ++n) {
double b = B[n];
double index = trunc([b]); //int part of B value
double alpha = b - index; //frac part of B value
double a0 = A[(int)index]; //indexed A value
double a1 = A[(int)index + 1]; //next A value
C[n] = a0 + (alpha * (a1 -a0)); //interpolated value
}
```
Generates vector C by interpolating between neighboring values of vector A as controlled by vector B. The integer portion of each element in B is the zero-based index of the first element of a pair of adjacent values in vector A.
The value of the corresponding element of C is derived from these two values by linear interpolation, using the fractional part of the value in B.
*/
func interpolate(inout a: [Double], inout b: [Double]) -> [Double] {
var c = [Double](count: b.count, repeatedValue: 0)
vDSP_vlintD(&a, &b, 1, &c, 1, UInt(b.count), UInt(a.count))
return c
}
编辑:好吧,我把头绕在你的问题上,我现在明白你想做什么了。做起来很有趣,我想出了这个:
import Accelerate
func calculateB(sampleTimes: [Double], outputTimes: [Double]) -> [Double] {
var i = 0
return outputTimes.map { (time: Double) -> Double in
defer {
if time > sampleTimes[i] { i++ }
}
return Double(i) + (time - sampleTimes[i]) / (sampleTimes[i+1] - sampleTimes[i])
}
}
func interpolate(inout b: [Double], inout data: [Double]) -> [Double] {
var c = [Double](count: b.count, repeatedValue: 0)
vDSP_vlintD(&data, &b, 1, &c, 1, UInt(b.count), UInt(data.count))
return c
}
let sampleTimes : [Double] = [0.0, 1.3, 2.2, 3.4, 4.2, 5.5, 6.6, 7.2, 8.4, 9.5, 10.0]
let outputTimes : [Double] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var metric_1 : [Double] = [4, 3, 6, 7, 4, 5, 7, 4, 2, 7, 2]
var metric_2 : [Double] = [5, 4, 7, 5, 6, 6, 1, 3, 1, 6, 7]
var metric_3 : [Double] = [9, 8, 5, 7, 4, 8, 5, 6, 8, 9, 5]
var b = calculateB(sampleTimes, outputTimes: outputTimes)
interpolate(&b, data: &metric_1) // [4, 3.230769, 5.333333, 6.666667, 4.75, 4.615385, 5.909091, 5, 2.666667, 4.727273, 2]
interpolate(&b, data: &metric_2) // [5, 4.230769, 6.333333, 5.666667, 5.75, 6, 3.727273, 2.333333, 1.666667, 3.727273, 7]
interpolate(&b, data: &metric_3) // [9, 8.230769, 5.666667, 6.333333, 4.75, 6.461538, 6.636364, 5.666667, 7.333333, 8.545455, 5]
vars 是 Accelerate 所必需的。我不知道如何calculateB
使用 Accelerate 来完成,我的意思是我认为有可能,但是寻找正确的vDSP
功能很痛苦......