所以我有一个函数总是返回范围<0; 99>(即0,1,... 99 - 整数)的数字.
将这些数字正确映射到范围<-1.0; 1.0>的最佳方法是什么?
0当然是-1.0而99则是1.0.如何计算之间的数字?
Mar*_*ers 22
使用线性映射:
y = ((x / 99.0) * 2) - 1
Run Code Online (Sandbox Code Playgroud)
这个怎么运作:
如果您愿意,您当然可以将步骤((x/99.0)*2)组合成一个部门.为了清楚起见,我把它拆开了.
Gle*_*ard 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))
Run Code Online (Sandbox Code Playgroud)
我发现这是任何语言中更有用的函数之一; 你可以一目了然地看出scale()调用的作用.
使用numpy,这将是最有效的
>>> from numpy import interp
>>> interp(50, [0,99], [-1,1])
0.010101010101010166
Run Code Online (Sandbox Code Playgroud)
要映射x此范围中的值:
[a..b]
Run Code Online (Sandbox Code Playgroud)
在此范围内:
[a'..b']
Run Code Online (Sandbox Code Playgroud)
你使用这个公式:
x' = (x / 99) * 2 - 1
Run Code Online (Sandbox Code Playgroud)
这种映射的工作方式如下:
x' = ((x - a) / (b - a)) * (b' - a') + a'
Run Code Online (Sandbox Code Playgroud)
一步步:
你先计算出多远成比例a..b的x就是价值:
(x - a) / (b - a)
Run Code Online (Sandbox Code Playgroud)
该值介于0和1之间.
然后使用此值来计算值的距离a'..b':
ratio * (b' - a') + a'
Run Code Online (Sandbox Code Playgroud)在您的特定情况下:
x' = ((x - 0) / (99 - 0)) * (1.0 - (-1.0)) + (-1.0)
Run Code Online (Sandbox Code Playgroud)
或以简约形式:
x' = (x / 99) * 2 - 1
Run Code Online (Sandbox Code Playgroud)
注意:如果您在编程语言中执行此操作,其中整数除以另一个整数是整数除法,则应将值提升为浮点以避免必须处理精度损失:
x' = (x / 99.0) * 2.0 - 1.0
Run Code Online (Sandbox Code Playgroud)
将此值用于任何范围(也可以为负数)。
[minFrom..maxFrom] -> [minTo..maxTo]
mappedValue = minTo + (maxTo - minTo) * ((value - minFrom) / (maxFrom - minFrom));
Run Code Online (Sandbox Code Playgroud)