2009-09-24 27 views
26

Estoy como atrapado aquí, supongo que es un poco un desafío para la mente. Si tengo números en el rango entre 0.5 a 1, ¿cómo puedo normalizarlo para que esté entre 0 y 1?Normalizando de [0.5 - 1] a [0 - 1]

Gracias por cualquier ayuda, tal vez estoy un poco lento, ya que he estado trabajando durante los últimos 24 horas seguidas O_O

+1

Supongo que los + votos fueron dirigidos exclusivamente a "estado trabajando durante las últimas 24 horas seguidas" :) – Michael

Respuesta

63

Otros le han proporcionado la fórmula, pero no el trabajo. Así es como abordas un problema como este. Puede encontrar esto mucho más valioso que simplemente saber la respuesta.

Para asignar [0.5, 1] a [0, 1] buscaremos un mapa lineal del formulario x -> ax + b. Exigiremos que los puntos finales estén mapeados a los puntos finales y ese orden se preserve.

Método uno: El requisito de que los puntos finales se asignan a los puntos finales y que el orden se conserva implica que 0.5 se asigna a 0 y 1 se asigna a 1

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

Este es un sistema simultáneo de ecuaciones lineales y se puede resolver multiplicando la ecuación (1) por -2 y agregando la ecuación (1) a la ecuación (2). Al hacer esto obtenemos b = -1 y sustituyéndolo de nuevo en la ecuación (2) obtenemos ese a = 2. Por lo tanto, el mapa x -> 2x - 1 hará el truco.

Método dos: La pendiente de una línea que pasa a través de dos puntos (x1, y1) y (x2, y2) es

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

Aquí vamos a utilizar los puntos de (0.5, 0) y (1, 1) para satisfacer el requisito de que los puntos finales se asignan a los puntos finales y que el mapa preserva el orden. Por lo tanto la pendiente es

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

Tenemos que (1, 1) es un punto de la línea y por lo tanto por la forma punto-pendiente de una ecuación de una línea que tenemos que

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

para que

y = 2x - 1. 

Una vez más vemos que x -> 2x - 1 es un mapa que hará el truco.

+0

En el método uno, para resolver, ¿por qué multiplicas la ecuación (1) por -2? – RobertL

+1

@RobertL: Para resolver un sistema lineal de dos ecuaciones con dos incógnitas, el método más fácil es convertir el sistema a uno equivalente donde los coeficientes en una de las incógnitas son iguales en ambas ecuaciones. Entonces aquí tenemos las dos ecuaciones 'a * (0.5) + b = 0' y' a * 1 + b = 1'. Después de multiplicar la primera ecuación por '2', llegamos a las dos ecuaciones' a + 2 * b = 0' y 'a * 1 + b = 1'. Como los coeficientes en 'a 'son iguales en ambas ecuaciones, podemos restar la primera ecuación del segundo para obtener' -b = 1'. – jason

15

× 2 - 1

debe hacer el truco

+3

Eso rondará a 0,1 o 2. – erelender

+3

Fue la parte matemática de la solución que estaba resolviendo no el idioma parte relacionada – Glenner003

31

Reste 0,5 (dándole un nuevo rango 0 - 0,5) luego se multiplica por 2.

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

Para agregar otra respuesta genérica.

Si desea asignar el rango lineal [A..B] a [C ..D], que se pueden aplicar los siguientes pasos:

desplazar el rango de modo que el límite inferior es 0. (subract A de ambos límites:

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

Escala el rango de lo que es [0..1] . (divide por el límite superior):

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

Escala de la gama por lo que tiene la longitud de la nueva gama que es DC (multiplicar con DC):.

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

Shift la gama por lo que el límite inferior es C. (añadir C a los límites):

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

Combinando esto a una sola fórmula, obtenemos:

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

En su caso, A = 0,5 , B = 1, C = de 0, D = 1 se obtiene:

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

Nota, si tiene que convertir una gran cantidad de X a X', se puede cambiar la fórmula a:

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

También es interesante echar un vistazo a los rangos no lineales. Puede seguir los mismos pasos, pero necesita un paso adicional para transformar el rango lineal en un rango no lineal.

+0

¿Qué sería lo que necesita hacer para acomodar un rango no lineal? Quiero convertir un rango de -1..1 a -.25..1 donde -.25..0..1 = -1..0..1 (entonces -0.25..0 es el rango completo de -1..0). – Shizam

14

respuesta lazyweb: para convertir un valor de x[minimum..maximum] a [floor..ceil]:

Caso general:

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

para normalizar a [0..255]:

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

Para normalizar a [0..1]:

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

Me gusta la forma en que generalizó su respuesta. Usé tu sintaxis para hacer esto en Python. +1 – MyCarta

0

Siempre puede utilizar la función de pinzamiento o saturación dentro de sus cálculos para asegurarse de que su valor final esté entre 0-1. Algunos se saturan al final, pero también lo he visto durante un cálculo.

Cuestiones relacionadas