如何将范围<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]
向该范围:
n = (n/99) * 2 - 1;
在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'
一步一步:
-
您第一计算的多远
a..b
的x
值是一个比:(x - a)/(b - a)
该值将介于0和1之间。
-
然后使用这个值来计算值应在多大程度上为
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()调用的内容。
我得到: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
这需要太多眯眼看什么实际上打算;这种映射非常普遍,应该以一种可以立即理解的方式编写。 – 2010-11-11 14:13:10