使用 Apache Math 使用样条函数调整一维数组的大小 - 如何?

1D Array resizing with Spline Functions using Apache Math - How to?

我正在寻找有关使用样条函数和 Apache Commons - Math 调整一维数组大小的示例。

我需要的是一种扩展and/or 收缩输入数组 (double[]) 的方法。

我在网上搜索找不到很好的例子。

这里的技巧是你需要两个 arrays 来创建一个 spline 但你只有一个。因此你需要编造一个array。您可以假设输入 array 包含您的 y 值,并且新构造的数组包含您的 x 值,因此对于任何给定的 x 您都有相应的 y.

免责声明,我尚未测试此代码,因此请务必进行相应调整。

// To expand the array
public static double[] expand(double[] array, int newSize) {

    final int length = array.length;

    // let's calculate the new step size
    double step = (double) length / (newSize + 1);

    // fabricated array of x values
    double[] x = new double[length];
    for(int i = 0; i < length; ++i) {
        x[i] = i;
    }

    // using Linear interpolator but it can be any other interpolator
    LinearInterpolator li = new LinearInterpolator(); // or other interpolator
    PolynomialSplineFunction psf = li.interpolate(x, array);

    double[] expandedArray = new double[newSize];
    double xi = x[0];
    for (int i = 0; i < newSize - 1; ++i) {
       expandedArray[i] = psf.value(xi);
       xi += step;
    }
    expandedArray[newSize - 1] = array[length - 1];
    return expandedArray;
}

shrink 数组,您可以 decimate 输入 array 即只需创建一个新的较小的 array 并根据新的步长获取值或像以前一样使用 interpolator

// To shrink the array
public static double[] shrink(double[] array, int newSize) {

    final int length = array.length;

    // let's calculate the new step size
    double step = (double) length / (newSize - 1);

    // fabricated array of x values
    double[] x = new double[length];
    for(int i = 0; i < length; ++i) {
        x[i] = i;
    }

    // using Linear interpolator but it can be any other interpolator
    LinearInterpolator li = new LinearInterpolator(); // or other interpolator
    PolynomialSplineFunction psf = li.interpolate(x, array);

    double[] expandedArray = new double[newSize];
    double xi = x[0];
    for (int i = 0; i < newSize - 1; ++i) {
       expandedArray[i] = psf.value(xi);
       xi += step;
    }
    expandedArray[newSize - 1] = array[length - 1];
    return expandedArray;
}