【发布时间】:2020-12-26 23:45:44
【问题描述】:
我被 Swift 中的插值困住了。谁能帮我解决这个问题?
我想将浮点数组(比如[0, 0, 100, 25, 0, 0, 0, 25, 0, 0, 0])插入到另一个具有给定大小(例如128)的数组中。我发现一篇文章 (Use Linear Interpolation to Construct New Data Points) 显示了如何实现这些东西。
有两种方法(你可以在下面看到结果,它们是如何执行的):
- 线性插值使用
vDSP_vgenp和 - 使用
vDSP_vlint进行更平滑的插值(但不是出于我的目的)
问题是这两种技术都没有实现我的期望,这在Screenshot 3 中有说明。如何使我的 内插 分布更平滑?我想看到一个立方体曲线。
初始情节:
线性插值:
import Accelerate
let n = vDSP_Length(128)
let stride = vDSP_Stride(1)
let values: [Float] = [0, 0, 100, 25, 0, 0, 0, 25, 0, 0, 0]
let indices: [Float] = [0, 11, 23, 34, 46, 58, 69, 81, 93, 104, 116]
var result = [Float](repeating: 0, count: Int(n))
vDSP_vgenp(values, stride, indices, stride, &result, stride, n, vDSP_Length(values.count))
平滑插值:
import Accelerate
import AVFoundation
let n = vDSP_Length(1024)
let stride = vDSP_Stride(1)
let values: [Float] = [0, 0, 100, 25, 0, 0, 0, 25, 0, 0, 0]
let denominator = Float(n) / Float(values.count - 1)
let control: [Float] = (0 ... n).map {
let x = Float($0) / denominator
return floor(x) + simd_smoothstep(0, 1, simd_fract(x))
}
var result = [Float](repeating: 0, count: Int(n))
vDSP_vlint(values, control, stride, &result, stride, n, vDSP_Length(values.count))
【问题讨论】:
-
我无法回答你的问题,但我不得不说,这是一个很好的问题,特别是对于第一次发帖的人!明确的问题、努力的证明、代码示例、实际结果与预期结果。干得好,欢迎!
-
非常感谢@Alexander-ReinstateMonica!我尽力证明,我想解决什么^_^
标签: swift interpolation cubic-spline vdsp accelerate