将数字列表从-1.0缩放到1.0

时间:2010-08-11 17:03:41

标签: algorithm scaling

这应该很容易。

我有一个数字列表。如何在-1.01.0之间缩放列表的值,以便min = -1max = 1.0

3 个答案:

答案 0 :(得分:16)

找出最小值和最大值

然后是每个数字刻度x2 * (x - min)/( max - min) - 1

只是为了检查 -

  1. min scale to -1
  2. 和max缩放为1
  3. 如果是长列表,则预先计算c = 2/(max - min)并使用c * x - 1进行缩放是一个好主意。

答案 1 :(得分:5)

这是签名规范化

1 - 获取列表中的最小值和最大值(MinVal,MaxVal)

2 - 使用此表达式转换每个数字       signedNormal =(((ori​​ginalNumber - Minimum)/(Maximum - Minimum))* 2.0) - 1.0

为了清楚起见,我刻意将此效率降低 - 效率更高

double min = myList.GetMinimum();
double max = myList.GetMaximum();
double signedRangeInverse = 1.0 / (max - min);
for(int i = 0;i < myList.NumberOfItems();i++)
  myList[i] = (((myList[i] - min) * signedRangeInverse) * 2.0) - 1

每次重新计算范围都没有意义 划分范围没有意义,mult更快

答案 2 :(得分:1)

如果你希望0在最终结果中仍然等于0:

  1. 找出幅度最大的数字。这将映射到1或-1。
  2. 找出你需要乘以它的东西,使它成为1或-1。
  3. 按该系数乘以集合中的所有数字。
  4. E.g

    [ -5, -3, -1, 0, 2, 4]
    

    幅度最大的数字是-5。我们可以通过乘以0.2(-1 / -5)得到它等于-1。 (如果你的数字都是0,请注意除以0。)

    所以将所有元素乘以0.2。这会给:

    [-1, -0.6, -0.2, 0, 0.4, 0.8]
    

    虽然注意到

    [ -5, -5, -5 ] -> [ -1, -1, -1 ]
    

    [ 5, 5, 5 ] -> [ 1, 1, 1 ]
    

    [ 0, 0, 0 ] -> [ 0, 0, 0 ]
    

    这可能是也可能不是你想要的。感谢@Hammerite用他非常有帮助的评论提示我这个:)