Если вы строите желаемые индексы относительно ваших входных индексов, вы получаете функцию треугольной формы. Получается, что для вашего n
= 10 случая это
9.5 - abs(2 (x - 4.75))
Следовательно, для общего n
это будет
n-0.5 - abs(2*(x - n/2-0.25))
или в виде целого числа,
(2*n-1 - abs(4*x - 2*n + 1)) / 2
Это совершенно не ветвится в том смысле, что ваши выходные индексы генерируются с помощью одной математической функции. Я думаю, что общий подход будет состоять в том, чтобы построить желаемые индексы и найти шаблон и способ представления его с помощью математических функций.
Очевидно, что если желаемые конечные индексы образуют прямую линию, преобразование будет простым. Если у вас есть излом в отображении, то вы хотите использовать функцию абсолютного значения, чтобы ввести изгиб, и вы можете настроить масштабирование, чтобы изменить угол изгиба. Вы можете наклонить излом, смещая его (например, abs(x)+x/2
). Если вам нужна прерывность перехода в вашей конечной индексной функции, используйте функцию sign (будем надеяться, встроенную или используйте abs (x) / x). Вы должны проявить творческий подход к тому, как использовать графики общих функций в ваших интересах.
Добавление
Если ваша функция индексирования кусочно-линейная, существует простой алгоритм. Предположим, что желаемая индексная функция выражается в виде списка сегментов
{(sx1,sy1)-(ex1,ey1), (sx2,sy2)-(ex2,ey2), ... , (sxN,syN)-(exN,eyN)}
segment 1 segment 2 segment N
где exK> sxK для всех K и sxK> sx (K-1) для всех K (поместите их слева направо).
k = 1
f(x) = Make affine model of segment k
g(x) = f(x)
Do:
k = k + 1
h(x) = Makeaffine model of segment k
If g(x) and h(x) intersect between ex(k-1) and ex(k)
f(x) = f(x) + [slope difference of g(x) and h(x)] * ramp(x)
Else
f(x) = f(x) + (h(ex(k-1)) - f(ex(k-1))) * step(x)
f(x) = f(x) + [slope difference of g(x) and h(x)] * ramp(x)
, где ramp(x) = (abs(x)+x)/2
и step(x) = (sign(x)+1)/2
. f (x) обозначает желаемую функцию, g(x)
- аффинную модель последнего сегмента, а h(x)
- аффинную модель текущего сегмента. Аффинная модель - это просто линия в форме смещения наклона: a*x+b
, а разница наклона - это разница наклона. Этот алгоритм просто работает слева направо, добавляя правильные части функций по мере продвижения. Функции, которые он добавляет, всегда равны нулю для x <= 0
, поэтому они не влияют на f(x)
, который был создан до сих пор.
Конечно, могут быть некоторые ошибки / опечатки в приведенном выше. Мне действительно нужно попасть на собрание, поэтому я больше не могу писать.