2009-09-24 13 views
26

Sono un po 'bloccato qui, immagino sia un po' un rompicapo. Se ho numeri compresi tra 0,5 e 1, come posso normalizzarlo tra 0 e 1?Normalizzazione da [0.5 - 1] a [0 - 1]

Grazie per qualsiasi aiuto, forse sono solo un po 'lento da quando ho lavorato negli ultimi 24 ore di fila O_O

+1

Immagino che i voti + siano stati diretti esclusivamente a "lavoro da 24 ore consecutive" :) – Michael

risposta

63

Altri ti hanno fornito la formula, ma non il lavoro. Ecco come ti avvicini a un problema come questo. Potresti trovare questo molto più prezioso della semplice conoscenza della risposta.

Per la mappa [0.5, 1] a [0, 1] cercheremo una mappa lineare del modulo x -> ax + b. Richiederemo che gli endpoint siano mappati sugli endpoint e che l'ordine sia preservato.

Metodo uno: Il requisito che gli endpoint sono mappati endpoint e che l'ordine è conservato implica che 0.5 viene mappata 0 e 1 viene mappata 1

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

Questo è un sistema simultaneo di equazioni lineari e può essere risolto moltiplicando l'equazione (1) per -2 e aggiungendo l'equazione (1) all'equazione (2). In questo modo otteniamo b = -1 e sostituendolo con l'equazione (2) otteniamo tale a = 2. Quindi la mappa x -> 2x - 1 farà il trucco.

Metodo due: La pendenza di una linea passante attraverso due punti (x1, y1) e (x2, y2) è

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

Qui useremo i punti (0.5, 0) e (1, 1) per soddisfare il requisito che gli endpoint sono mappati endpoint e che la mappa è preservare l'ordine. Pertanto la pendenza è

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

Abbiamo quella (1, 1) è un punto sulla linea e quindi dalla forma punto-pendenza della equazione di una retta abbiamo che

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

modo che

y = 2x - 1. 

Ancora una volta vediamo che x -> 2x - 1 è una mappa che farà il trucco.

+0

Nel metodo uno, per risolvere, perché moltiplichi l'equazione (1) per -2? – RobertL

+1

@RobertL: Per risolvere un sistema lineare di due equazioni con due incognite, il metodo più semplice è convertire il sistema in uno equivalente dove i coefficienti su uno degli sconosciuti sono uguali in entrambe le equazioni. Quindi qui abbiamo le due equazioni 'a * (0.5) + b = 0' e' a * 1 + b = 1'. Dopo aver moltiplicato la prima equazione per '2' arriviamo alle due equazioni' a + 2 * b = 0' e 'a * 1 + b = 1'. Poiché i coefficienti su 'a' sono uguali in entrambe le equazioni, possiamo sottrarre la prima equazione dalla seconda per ottenere' -b = 1'. – jason

15

× 2 - 1

dovrebbe fare il trucco

+3

Che arrotonderà a 0,1 o 2. – erelender

+3

Era la parte matematica della soluzione che stavo risolvendo non la lingua parte correlata – Glenner003

31

Sottrai 0.5 (dando una nuova gamma di 0-0,5) poi moltiplicare per 2.

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

Per aggiungere un'altra risposta generica.

Se si desidera mappare il campo lineare [A..B] a [C ..D], è possibile applicare le seguenti operazioni:

spostare la gamma in modo che il limite inferiore è 0. (subract A da entrambi i limiti:

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

Scala la gamma quindi è [0..1] . (dividere per il limite superiore):

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

scala nell'intervallo quindi ha la lunghezza della nuova gamma che è DC (moltiplicare con DC):.

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

spostare la gamma in modo che il limite inferiore è C. (aggiungi C per i limiti):

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

Combinando questo ad una singola formula, otteniamo:

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

Nel tuo caso, A = 0.5 , B = 1, C = 0, D = 1 si ottiene:

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

nota, se si deve convertire un sacco di X a X', è possibile modificare la formula per:

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

È anche interessante dare un'occhiata a intervalli non lineari. È possibile eseguire gli stessi passaggi, ma è necessario un ulteriore passaggio per trasformare l'intervallo lineare in un intervallo non lineare.

+0

Quale sarebbe la cosa che dovresti fare per poter ospitare una gamma non lineare? Voglio convertire un intervallo da -1..1 a -.25..1 dove -.25..0..1 = -1..0..1 (così -0.25..0 è l'intero intervallo di -1..0). – Shizam

14

risposta Lazyweb: per convertire un valore x da [minimum..maximum] a [floor..ceil]:

Caso generale:

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

per normalizzare a [0..255]:

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

Per normalizzare a [0..1]:

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

Mi piace il modo in cui hai generalizzato la tua risposta. Ho usato la tua sintassi per farlo in Python. +1 – MyCarta

0

È sempre possibile utilizzare il morsetto o saturare all'interno della matematica per assicurarsi che il valore finale sia compreso tra 0 e 1. Alcuni si saturano alla fine, ma l'ho visto anche durante il calcolo.

Problemi correlati