2009-09-24 101 views
26

我有点卡在这里,我猜这是一个脑部传情。如果我的数字范围在0.5到1之间,我如何将它标准化为0到1之间?正常化从[0.5 - 1]到[0 - 1]

感谢您的帮助,也许我只是有点慢,因为我已经工作了过去24个小时了O_O

+1

我假设+的投票是专门针对“一直工作过去24小时直”:) – Michael 2014-01-13 23:44:45

回答

63

其他人提供了你的公式,但不是工作。以下是你如何处理这样的问题。你可能会发现这比仅仅知道答案更有价值。我们将寻找x -> ax + b的线性地图。我们将要求将端点映射到端点,并保留该顺序。

方法一:端点被映射到端点和该顺序被保存的要求意味着0.5映射到01被映射到1

a * (0.5) + b = 0 (1) 
a * 1 + b = 1  (2) 

这是线性方程的同时系统并且可以通过将方程(1)乘以-2并且将方程(1)添加到方程(2)来解决。在这样做时,我们获得b = -1并且将其替换回等式(2),我们获得a = 2。因此,地图x -> 2x - 1将做的伎俩。

方法二:通过两个点(x1, y1)(x2, y2)线的斜率是

(y2 - y1)/(x2 - x1). 

在这里,我们将使用点(0.5, 0)(1, 1)满足端点被映射到端点和要求该地图是保存顺序的。因此,斜率是

m = (1 - 0)/(1 - 0.5) = 1/0.5 = 2. 

我们有(1, 1)是线路上的点,并因此通过的线的​​方程的点斜形式我们有

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

使得

y = 2x - 1. 

我们再次看到x -> 2x - 1是一个可以做到这一点的地图。

+0

在方法一中,为了解决,为什么要将方程(1)乘以-2? – RobertL 2009-09-24 16:03:50

+1

@RobertL:为了求解一个具有两个未知数的两个方程的线性系统,最简单的方法是将该系统转换为其中一个未知数的系数在两个方程中相等的等价系统。所以在这里我们有两个方程:a *(0.5)+ b = 0和a * 1 + b = 1。在将第一个等式乘以2后,我们得到两个等式'a + 2 * b = 0'和'a * 1 + b = 1'。由于'a'的系数在两个方程中都是相等的,所以我们可以从第二个方程中减去第一个方程以获得'-b = 1'。 – jason 2009-09-24 17:35:30

15

×2 - 1

应该做的伎俩

+3

这将舍入到0,1或2. – erelender 2009-09-24 12:36:27

+3

这是解决方案的数学部分我解决的不是语言相关部分 – Glenner003 2009-09-24 12:59:00

31

减去0.5(给你的0新的范围 - 0.5)再乘以2。

double normalize(double x) 
{ 
    // I'll leave range validation up to you 
    return (x - 0.5) * 2; 
} 
24

添加另一个通用答案。

如果要将线性范围[A..B]映射到[C ..d]时,可以应用以下步骤:

移位的范围,因此下限是0(从两个界限subract答:

[A..B] -> [0..B-A] 

量表所以它是范围[0..1] (由上限除):

[0..B-A] -> [0..1] 

量表因此它具有新的范围是DC的长度的范围内(与DC乘法):

[0..1] -> [0..D-C] 

移的范围内,因此下限是C.(添加C至界限):

[0..D-C] -> [C..D] 

此结合到一个单一的公式,我们得到:

 (D-C)*(X-A) 
X' = ----------- + C 
      (B-A) 

在你的情况下,A = 0.5 ,B = 1,C = 0,d = 1你:

 (X-0.5) 
X' = ------- = 2X-1 
     (0.5) 

注意,如果你要转换大量的X到X的”,您可以更改公式:

 (D-C)   C*B - A*D 
X' = ----- * X + --------- 
     (B-A)   (B-A) 

查看非线性范围也很有趣。您可以采取相同的步骤,但需要额外的步骤将线性范围转换为非线性范围。

+0

为了适应非线性范围,您需要做什么?我想将-1..1范围转换为-.25..1,其中-.25..0..1 = -1..0..1(因此-0.25..0是整个范围-1..0)。 – Shizam 2013-10-07 19:45:42

14

Lazyweb答案:

一般情况下:的值x[minimum..maximum][floor..ceil]转换

normalized_x = ((ceil - floor) * (x - minimum))/(maximum - minimum) + floor 

为了归为[0..255]:

normalized_x = (255 * (x - minimum))/(maximum - minimum) 

归一化为[0..1]:

normalized_x = (x - minimum)/(maximum - minimum) 
+0

我喜欢你一般化你的答案的方式。我用你的语法在Python中做这个。 +1 – MyCarta 2014-05-07 02:38:08

0

您可以在您的数学中始终使用钳位或饱和以确保您的最终值在0-1之间。最后有些饱和,但我也在计算过程中看到它完成。