所以我有一個函數,它總是返回範圍爲< 0; 99>(即0,1,... 99 - 整數)的數字。如何將範圍<0;99>中的數字映射到範圍<-1.0;1.0>?
將這些數字正確映射到範圍< -1.0; 1.0>的最佳方法是什麼?
0當然是-1.0,而99會是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
工作原理:
如果您願意,您當然可以將步驟((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