gpt4 book ai didi

java - Scala 与 Java 中的样条插值性能

转载 作者:行者123 更新时间:2023-11-30 05:50:16 26 4
gpt4 key购买 nike

我翻译了this spline interpolation algorithm从 apache.commons.math 从 Java 到 Scala 以我能想到的最直接的方式(见下文)。我最终得到的函数运行速度比原始 Java 代码慢 2 到 3 倍。我的猜测是问题源于调用 Array.fill 的额外循环,但我想不出一种直接的方法来摆脱它们。关于如何使此代码性能更好的任何建议? (以更简洁和/或更实用的方式编写它也很好——在这方面的建议也将不胜感激。)

type Real = Double

def mySplineInterpolate(x: Array[Real], y: Array[Real]) = {

if (x.length != y.length)
throw new DimensionMismatchException(x.length, y.length)

if (x.length < 3)
throw new NumberIsTooSmallException(x.length, 3, true)

// Number of intervals. The number of data points is n + 1.
val n = x.length - 1

// Differences between knot points
val h = Array.tabulate(n)(i => x(i+1) - x(i))

var mu: Array[Real] = Array.fill(n)(0)
var z: Array[Real] = Array.fill(n+1)(0)
var i = 1
while (i < n) {
val g = 2.0 * (x(i+1) - x(i-1)) - h(i-1) * mu(i-1)
mu(i) = h(i) / g
z(i) = (3.0 * (y(i+1) * h(i-1) - y(i) * (x(i+1) - x(i-1))+ y(i-1) * h(i)) /
(h(i-1) * h(i)) - h(i-1) * z(i-1)) / g
i += 1
}

// cubic spline coefficients -- b is linear, c quadratic, d is cubic (original y's are constants)
var b: Array[Real] = Array.fill(n)(0)
var c: Array[Real] = Array.fill(n+1)(0)
var d: Array[Real] = Array.fill(n)(0)

var j = n-1
while (j >= 0) {
c(j) = z(j) - mu(j) * c(j + 1)
b(j) = (y(j+1) - y(j)) / h(j) - h(j) * (c(j+1) + 2.0 * c(j)) / 3.0
d(j) = (c(j+1) - c(j)) / (3.0 * h(j))
j -= 1
}

Array.tabulate(n)(i => Polynomial(Array(y(i), b(i), c(i), d(i))))
}

最佳答案

您可以去掉所有的 Array.fill,因为新数组总是初始化为 0 或 null,具体取决于它是值还是引用( boolean 值初始化为 false,并且带有 \0 的字符)。

您也许可以通过压缩数组来简化循环,但只会让它变慢。函数式编程(无论如何在 JVM 上)可以帮助您更快地完成此操作的唯一方法是,如果您将其设置为非严格的,例如使用 Stream 或 View ,然后您继续不要全部使用。

关于java - Scala 与 Java 中的样条插值性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14330737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com