Каков общий способ «сопоставить» произвольные значения (с точностью до определенного диапазона) до дискретных значений массива?Общее решение для отображения значений в массив
В основном то, что я хотел бы сделать, это предвычисление комплексной функции x = f(x)
для диапазона дискретных входных значений x
и хранить каждое значение выходного f(x)
в другом массиве fx
, так что есть два вектора:
x
- дискретные значения входных иfx
- соответствующие дискретные выходные значения
Теперь для произвольное значение с диапазоном x
Я хотел бы получить соответствующий результат от fx
, e. г. для значения x1 = 42
и векторов
x = [ 30, 35, 40, 45, 50];
fx = [1.3, 1.8, 2.9, 4.5, 7.3];
функция, возможно, может вернуться
fx1 = 4.5
- отображение наfx
, принимаяx
в качестве верхней границыfx1 = 2.9
- отображение, чтобыfx
принимать ближайшее значение изx
fx1 = 3.54
- картографированиеfx
проведение сим PLE линеаризация
fx1 = fxa + (fxb-fxa)/(xb-xa) * (x1-xa)
fx1 = 2.9 + (4.5-2.9)/(45-40) * (42-40)
Функция * должна быть очень быстро, так как он заменяет призвание "реальной" функции в тугой петлей. Первая попытка, которая используется, чтобы поместить в PRACTIVE случай один из верхнего списка выглядит следующим образом:
%% GET AT
% Retrieve f(x).
%
% * Synopsis: getAt (x, input_map, output_map)
% * Input : x - function input
% : input_map - array with precomputed input values
% : output_map - array with precomputed output values
%
% * Output : fx - function output
%
function fx = getAt (x, input_map, output_map)
n = length(input_map);
jj = length(find(input_map < x));
if (jj >= n)
fx = 0;
else
fx = output_map(jj+1);
end
end
Однако я еще ищу решение C, поскольку цикл будет также в С.
* .. Просто ищет способ сделать это не для функция как в языке конструкция.
google "бинарный поиск" + "интерполяция". –
Вы пробовали Matlab 'interp1'? –
Примечание: ИМО эквивалентная математическая форма '= (fxa * xb - fxb * xa + (fxb-fxa) * x1)/(xb-xa)' to 'fxa + (fxb-fxa)/(xb-xa) * (x1-xa) '(подход № 3) является более стабильным с вычислительной точки зрения. Чтобы сделать «Функция * должна быть очень быстрой», код мог бы добавить 2 предварительно вычисленных поля: slope '(fxb-fxa)/(xb-xa)' и offset '(fxa * xb - fxb * xa)/(xb-xa) ', затем используйте' fx1 = slope * x1 + offset'. – chux