如何将范围<0;99>中的数字映射到范围<-1.0;1.0>?

如何将范围<0;99>中的数字映射到范围<-1.0;1.0>?

问题描述:

所以我有一个函数,它总是返回范围为< 0; 99>(即0,1,... 99 - 整数)的数字。如何将范围<0;99>中的数字映射到范围<-1.0;1.0>?

将这些数字正确映射到范围< -1.0; 1.0>的最佳方法是什么?

0当然是-1.0,而99会是1.0。如何计算之间的数字?

使用的线性映射:

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

工作原理:

  • 除以99:此归一化范围从[0,99]到[0,1]。
  • 乘以2:这会将范围增加到[0,2]。
  • 减法1:这是给出[-1,1]的译文。

如果您愿意,您当然可以将步骤((x/99.0)* 2)合并为一个分区。为了清晰起见,我将它分开。

[a..b] 

向该范围:

+1

这需要太多眯眼看什么实际上打算;这种映射非常普遍,应该以一种可以立即理解的方式编写。 – 2010-11-11 14:13:10

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

在Python 2.x中,这需要'from __future__ import division'才能正常工作。或者像马克·拜尔斯那样使99浮动。 – 2010-11-11 13:43:48

要从该范围映射的值x

[a'..b'] 

使用此公式:

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

这样的映射的工作方式如下:

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

一步一步:

  1. 您第一计算的多远a..bx值是一个比:

    (x - a)/(b - a) 
    

    该值将介于0和1之间。

  2. 然后使用这个值来计算值应在多大程度上为a'..b'是:

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

你的具体情况:

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

或承包形式:

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

注意:如果你在一个编程语言,其中整数除以另一个整数得到的整数除法这样做,你应该提倡值浮点以避免处理的精度损失:

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

不要手动进行缩放;在数学上眯缝了眼睛以找出真正意图的东西。使用助手功能。

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)) 

我发现这是比较有用的功能,在任何语言中的一个;您可以一目了然地了解scale()调用的内容。

+0

我得到:TypeError:'int'/'float'对象不可下标。 :/ – 2018-01-05 16:01:29

将此用于任何范围(也可以是负值)。

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

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

使用numpy,这将是最有效的

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