2009-09-24 6 views
26

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

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

+1

Я предполагаю, что голоса + были направлены исключительно на «работали в течение последних 24 часов подряд» :) – Michael

ответ

63

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

На карту [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 - это карта, которая сделает трюк.

+0

В методе 1, чтобы решить, почему вы умножаете уравнение (1) на -2? – RobertL

+1

@ RobertL: Чтобы решить линейную систему двух уравнений с двумя неизвестными, самый простой способ - преобразовать систему в эквивалентную, где коэффициенты на одном из неизвестных равны в обоих уравнениях. Итак, здесь мы имеем два уравнения: a * (0.5) + b = 0' и 'a * 1 + b = 1'. После умножения первого уравнения на '2' мы приходим к двум уравнениям: a + 2 * b = 0' и' a * 1 + b = 1'. Так как коэффициенты на 'a' равны в обоих уравнениях, мы можем вычесть первое уравнение из второго, чтобы получить' -b = 1'. – jason

15

× 2 - 1

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

+3

Это будет округлять до 0,1 или 2. – erelender

+3

Это была математическая часть решения, которое я решал не на языке связанная часть – Glenner003

31

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

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

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

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

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

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

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

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

Масштаб диапазон поэтому он имеет длину нового диапазона, который является DC (умножение с DC):.

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

сдвига диапазона, так что нижняя граница C (C добавляют к границам):

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

В сочетании с одной формулой, мы получим:

 (D-C)*(X-A) 
X' = ----------- + C 
      (B-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) 

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

+0

Что вам нужно сделать, чтобы разместить нелинейный диапазон? Я хочу преобразовать диапазон от -1.1 до -.25..1 где -.25..0..1 = -1..0..1 (так что -0.25..0 - весь диапазон -1..0). – Shizam

14

Lazyweb Ответ: Чтобы преобразовать значение 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) 
+0

Мне нравится, как вы обобщили свой ответ. Я использовал ваш синтаксис для этого в Python. +1 – MyCarta

0

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

Смежные вопросы