所以我有一个函数总是返回范围< 0; 99>的数字。 (即0,1,... 99 - 整数)。
将这些数字正确映射到范围< -1.0; 1.0>的最佳方法是什么?
0当然是-1.0而99则是1.0。如何计算?之间的数字?
答案 0 :(得分:22)
使用线性映射:
y = ((x / 99.0) * 2) - 1
工作原理:
如果您愿意,您当然可以将步骤((x / 99.0)* 2)组合成一个部门。为了清楚起见,我把它拆开了。
答案 1 :(得分:18)
不要手动缩放;在计算出真正意图的数学时,需要花太多时间眯着眼睛看。使用辅助函数。
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()调用的作用。
答案 2 :(得分:7)
从此范围映射值x
:
[a..b]
到此范围:
[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
答案 3 :(得分:3)
将此用于任何范围(也可以为负数)。
[minFrom..maxFrom] - > [minTo..maxTo]
mappedValue = minTo + (maxTo - minTo) * ((value - minFrom) / (maxFrom - minFrom));
答案 4 :(得分:2)
使用numpy
,这将是最有效的
>>> from numpy import interp
>>> interp(50, [0,99], [-1,1])
0.010101010101010166
答案 5 :(得分:-1)
n = (n / 99) * 2 - 1;