Нормализация от [0,5 - 1] до [0 - 1]
Я как бы застрял здесь, я думаю, это немного мозговой тизер. Если у меня есть числа в диапазоне от 0,5 до 1, как я могу нормализовать его между 0 и 1?
Спасибо за любую помощь, может быть, я просто немного замедлился, так как я работал в течение 24 часов прямо O_O
Ответы
Ответ 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. Некоторые насыщают в конце, но я видел это и во время вычисления.