2010-11-11 20 views

Respuesta

21

Utilice una aplicación lineal:

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

Cómo funciona:

  • Dividir por 99: Esto normaliza el rango de [0, 99] a [0, 1].
  • Multiplicar por 2: Esto aumenta el rango a [0, 2].
  • Restar 1: Esta es una traducción que da [-1, 1].

Por supuesto, puede combinar los pasos ((x/99.0) * 2) en una sola división si lo desea. Simplemente lo dividí por claridad.

+1

Esto requiere demasiado entrecerrando los ojos para ver lo que hay realmente previsto; este tipo de mapeo es muy común y debe escribirse de una manera comprensible al instante. –

-1
n = (n/99) * 2 - 1; 
+2

En Python 2.x, esto necesita 'desde __future__ división de importación' para funcionar correctamente. Eso, o hacer que 99 flote, como lo hizo Mark Byers. –

6

Para asignar un valor x nuestras secciones

[a..b] 

Para este rango:

[a'..b'] 

Se utiliza esta fórmula:

x' = (x/99) * 2 - 1 

La forma en que funciona esta correspondencia es la siguiente:

x' = ((x - a)/(b - a)) * (b' - a') + a' 

Paso a paso:

  1. En primer lugar, calcular una proporción de hasta qué punto en a..b el valor x es:

    (x - a)/(b - a) 
    

    Este valor estará entre 0 y 1.

  2. A continuación, se utiliza este valor para calcular hasta qué punto en a'..b' el valor debe ser:

    ratio * (b' - a') + a' 
    

En su caso particular:

x' = ((x - 0)/(99 - 0)) * (1.0 - (-1.0)) + (-1.0) 

o en forma contraída:

x' = (x/99) * 2 - 1 

Nota: Si usted está haciendo esto en un lenguaje de programación en el número entero dividido por otro entero es la división entera, debe promover los valores de punto flotante para no tener que hacer frente a una pérdida de precisión:

x' = (x/99.0) * 2.0 - 1.0 
14

No hagas escalas manualmente; Se necesita demasiado entrecerrando los ojos para entender qué es lo que realmente se pretende. Use una función de ayuda.

def scale(val, src, dst): 
    """ 
    Scale the given value from the scale of src to the scale of dst. 
    """ 
    return ((val - src[0])/(src[1]-src[0])) * (dst[1]-dst[0]) + dst[0] 

print scale(0, (0.0, 99.0), (-1.0, +1.0)) 
print scale(1, (0.0, 99.0), (-1.0, +1.0)) 
print scale(99, (0.0, 99.0), (-1.0, +1.0)) 

He encontrado que esta es una de las funciones más útiles para tener en cualquier idioma; puede ver lo que hacen las llamadas scale() de un vistazo.

+0

Obtengo: TypeError: el objeto 'int'/'float' no es subscripible. : / –

2

Utilice esto para cualquier rango (puede ser negativo, también).

[minFrom..maxFrom] -> [minTo..maxTo]

mappedValue = minTo + (maxTo - minTo) * ((value - minFrom)/(maxFrom - minFrom)); 
2

Uso numpy, que sería más eficiente

>>> from numpy import interp 
>>> interp(50, [0,99], [-1,1]) 
0.010101010101010166 
Cuestiones relacionadas