Изменение размера одномерного массива с помощью сплайн-функций с использованием Apache Math — Как это сделать?

Я ищу пример изменения размера одномерного массива с использованием функций сплайна с Apache Commons - Math.

Мне нужен метод расширения и/или сжатия входного массива (double[]).

Я не смог найти хороший пример, пытаясь найти в Интернете.


person 3xCh1_23    schedule 11.12.2019    source источник


Ответы (1)


Хитрость здесь в том, что вам нужно два 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;
}
person StaticBeagle    schedule 11.12.2019