【问题标题】:Scale a list of numbers from -1.0 to 1.0将数字列表从 -1.0 缩放到 1.0
【发布时间】:2010-08-11 17:03:41
【问题描述】:

这应该很容易。

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

【问题讨论】:

  • 视情况而定。您是否希望 0 在最终结果中仍然等于 0?
  • @Alex:如果 0 不在范围内,这甚至可能都不可能。
  • 在所有数字都相同的退化情况下你想发生什么?
  • @relet - 0 是否在范围内无关紧要 - 我们说最小值缩放为 -1 并且 最大值缩放为 1,或者我们假设我们想要在 0 附近缩放,在这种情况下,我们只需要具有最高幅度的数字并将其缩放为 1 或 -1,并使用相同的比率缩放所有其他数字。我知道我的意思:)
  • 我知道你明白你的意思。 :D

标签: algorithm scaling


【解决方案1】:

求最小值和最大值

然后对于每个数字从x2 * (x - min)/( max - min) - 1

只是为了检查——

  1. min 缩放为 -1
  2. 和最大比例为 1

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

【讨论】:

  • 我支持关于在可能的情况下进行预计算的说明。如果您使用上面的表格,您的编译器可能不够聪明,无法自动进行优化(它可能不会尝试将2 和分子转换为将常量组合在一起)。
  • 只是用一个例子来注释(使用我在回答中使用的输入进行比较),我相信列表 [ -5, -3, -1, 0, 2, 4 ] 将映射到[-1,-0.55555,-0.11111,0.11111,0.55555,1]。这说明了当我问我们是否希望结果中的 0 仍然等于 0 时我的意思。
  • @Alex 是的,但是为什么你会期望 0 映射到 0?
  • 我不 expect 0 必须映射到 0,这只是一种可能的情况 - 问题没有说明哪个是必需的。我并不是要以任何方式批评您的答案 - 这当然是一个非常好的答案,看起来它可能正是需要的。我只是认为值得用一个具体的例子来注释它,这样你和马克的答案就与我的不同了。我想我可以把它放在我的答案中,而不是把你问题的 cmets 弄得乱七八糟——如果你愿意,我会把它移到我的答案中。
  • 一个概括是; a = 边界最大值 - 边界最小值; b = 边界最小值; c = a / (max - min);最后对于每个 x 传递 c * (x - min) + b。现在为所需的示例设置boundary_min = -1,boundary_max = 1。要获得类似于累积百分比的设置boundary_min = 0,boundary_max = 100。
【解决方案2】:

这是一个有符号的规范化

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

2 - 使用这个表达式转换每个数字 signedNormal = (((originalNumber - 最小值) / (最大值 - 最小值)) * 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更快

【讨论】:

    【解决方案3】:

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

    1. 找出最大的数。这将映射到 1 或 -1。
    2. 计算出需要乘以使其为 1 或 -1 的值。
    3. 将集合中的所有数字乘以该因子。

    例如

    [ -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 用他非常有帮助的评论提示我:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多