ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
15 мая
1586925 Топик полностью
Nikolay_Po (Сегодня, 11:37, просмотров: 35) ответил Make_Pic на ОК
Поискал. В том коде, о котором помнил, не оказалось интерполяции - просто перепутал и запамятовал. А там, где она была - того не нашёл. 

Из того что вспоминал по ходу поиска:


- Это была интерполяция на основе кубического сплайна;

- Но по малому количеству точек - буквально, 4 соседние точки - чтобы не считать много коэффициентов;

- Была статья/заметка, где рассматривался такой вариант, из неё и взял принцип;

- Из-за малого количества точек, вся кубичность вырождалась в перемножения/сложения. Может, было деление - не помню, но вычислений корней и прочего тяжёлого - не было.


И, вроде бы, оно работало и для иррегулярной сетки исходных данных (ваш случай для оптимизации размеров корректировочных таблиц).

К сожалению, не помню большего. Некоторые проекты, где оно было, не попали в бекапы или я их просто ещё не смог найти...


UPD:

Обидно стало. Напрягся и нашёл из принципа. Результат дал поиск на английском языке.

Использовал "Parabolic (quadratic) spline interpolation". Вот пример от ИИ Гугла:

typedef struct {
    float x;
    float y;
} Point;

float eval_parabolic_spline(float x, Point p1, Point p2, Point p3) { // This example uses simple 3-point Lagrange-based parabolic interpolation // p1 = (x_{i-1}, y_{i-1}), p2 = (x_{i}, y_{i}), p3 = (x_{i+1}, y_{i+1}) float x1 = p1.x, y1 = p1.y; float x2 = p2.x, y2 = p2.y; float x3 = p3.x, y3 = p3.y; float term1 = y1 * ((x - x2) * (x - x3)) / ((x1 - x2) * (x1 - x3)); float term2 = y2 * ((x - x1) * (x - x3)) / ((x2 - x1) * (x2 - x3)); float term3 = y3 * ((x - x1) * (x - x2)) / ((x3 - x1) * (x3 - x2)); return term1 + term2 + term3; }


Всё-таки три деления. Но вроде, оно-самое. По трём точкам (помню, что по трём). Код нужно проверять - это ИИ. С целыми числами тоже будет работать.