Подтвердить что ты не робот

Нормализация от [0,5 - 1] до [0 - 1]

Я как бы застрял здесь, я думаю, это немного мозговой тизер. Если у меня есть числа в диапазоне от 0,5 до 1, как я могу нормализовать его между 0 и 1?

Спасибо за любую помощь, может быть, я просто немного замедлился, так как я работал в течение 24 часов прямо O_O

4b9b3361

Ответ 1

Другие предоставили вам формулу, но не работу. Вот как вы подходите к такой проблеме. Вы можете найти это гораздо более ценным, чем просто ответ на этот вопрос.

Чтобы отобразить [0.5, 1] в [0, 1], мы будем искать линейное отображение вида x -> ax + b. Мы будем требовать, чтобы конечные точки были сопоставлены с конечными точками и этот порядок сохранен.

Метод один: Требование о том, чтобы конечные точки были сопоставлены с конечными точками и этот порядок сохранен, подразумевает, что 0.5 отображается на 0, а 1 отображается на 1

a * (0.5) + b = 0 (1)
a * 1 + b = 1     (2)

Это одновременная система линейных уравнений и может быть решена путем умножения уравнения (1) на -2 и добавления уравнения (1) к уравнению (2). Сделав это, получим b = -1 и подставив это обратно в уравнение (2), получим, что a = 2. Таким образом, карта x -> 2x - 1 выполнит трюк.

Метод второй: Наклон линии, проходящей через две точки (x1, y1) и (x2, y2), равен

(y2 - y1) / (x2 - x1).

Здесь мы будем использовать точки (0.5, 0) и (1, 1), чтобы соответствовать требованию о том, чтобы конечные точки были сопоставлены с конечными точками и чтобы карта сохраняла порядок. Поэтому наклон

m = (1 - 0) / (1 - 0.5) = 1 / 0.5 = 2.

Мы имеем, что (1, 1) является точкой на линии и, следовательно, формулой точечного уравнения уравнения прямой имеем, что

y - 1 = 2 * (x - 1) = 2x - 2

так что

y = 2x - 1.

Вновь мы видим, что x -> 2x - 1 - это карта, которая сделает трюк.

Ответ 2

Вычитайте 0.5 (давая новый диапазон 0 - 0,5), затем умножьте на 2.

double normalize( double x )
{
    // I'll leave range validation up to you
    return (x - 0.5) * 2;
}

Ответ 3

Чтобы добавить еще один общий ответ.

Если вы хотите сопоставить линейный диапазон [A..B] с [C..D], вы можете применить следующие шаги:

Сдвиньте диапазон, так что нижняя граница равна 0. (отрыв А от обеих границ:

[A..B] -> [0..B-A]

Измените диапазон так, чтобы он был [0..1]. (делим на верхнюю границу):

[0..B-A] -> [0..1]

Увеличьте диапазон, чтобы он имел длину нового диапазона, который является D-C. (умножить на D-C):

[0..1] ->  [0..D-C]

Сдвиньте диапазон, чтобы нижняя граница была C. (добавьте C к границам):

[0..D-C] -> [C..D]

Объединяя это с одной формулой, получим:

       (D-C)*(X-A)
X' =   -----------  + C
          (B-A)

В вашем случае A = 0,5, B = 1, C = 0, D = 1 вы получаете:

       (X-0.5)
X' =   ------- = 2X-1
        (0.5)

Обратите внимание, что если вам нужно преобразовать много X в X ', вы можете изменить формулу на:

       (D-C)         C*B - A*D
X' =   ----- * X  +  ---------  
       (B-A)           (B-A)

Также интересно взглянуть на нелинейные диапазоны. Вы можете предпринять те же шаги, но вам нужен дополнительный шаг для преобразования линейного диапазона в нелинейный диапазон.

Ответ 4

× 2 - 1

должен сделать трюк

Ответ 5

Lazyweb answer: Чтобы преобразовать значение x с [minimum..maximum] в [floor..ceil]:

Общий случай:

normalized_x = ((ceil - floor) * (x - minimum))/(maximum - minimum) + floor

Для нормализации к [0..255]:

normalized_x = (255 * (x - minimum))/(maximum - minimum)

Для нормализации к [0..1]:

normalized_x = (x - minimum)/(maximum - minimum)

Ответ 6

Вы всегда можете использовать зажим или насыщение в своей математике, чтобы убедиться, что ваше окончательное значение находится между 0-1. Некоторые насыщают в конце, но я видел это и во время вычисления.