从 [0.5 - 1] 规范化到 [0 - 1]

Posted

技术标签:

【中文标题】从 [0.5 - 1] 规范化到 [0 - 1]【英文标题】:Normalizing from [0.5 - 1] to [0 - 1] 【发布时间】:2010-12-01 01:53:15 【问题描述】:

我有点卡在这里,我想这有点脑筋急转弯。如果我有介于 0.5 到 1 之间的数字,我如何将其标准化为 0 到 1 之间?

感谢您的帮助,也许我在过去的 24 小时内一直在工作,所以我的速度有点慢 O_O

【问题讨论】:

我认为 + 投票完全针对“过去 24 小时连续工作”:) 【参考方案1】:

其他人为您提供了公式,但没有为您提供工作。这是您处理此类问题的方法。您可能会发现这比知道答案更有价值。

为了将[0.5, 1] 映射到[0, 1],我们将寻求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 是一张可以解决问题的地图。

【讨论】:

在方法一中,要求解,为什么将方程(1)乘以-2? @RobertL:要求解具有两个未知数的两个方程的线性系统,最简单的方法是将系统转换为等效系统,其中一个未知数的系数在两个方程中相等。所以这里我们有两个方程a * (0.5) + b = 0a * 1 + b = 1。将第一个方程乘以2 后,我们得到两个方程a + 2 * b = 0a * 1 + b = 1。由于a 上的系数在两个方程中相等,我们可以从第二个方程中减去第一个方程得到-b = 1【参考方案2】:

减去 0.5(给你一个 0 - 0.5 的新范围)然后乘以 2。

double normalize( double x )

    // I'll leave range validation up to you
    return (x - 0.5) * 2;

【讨论】:

【参考方案3】:

添加另一个通用答案。

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

移动范围,使下限为 0。(从两个边界中减去 A:

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

缩放范围,使其为 [0..1]。 (除以上限):

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

缩放范围,使其具有新范围的长度,即 D-C。 (乘以 D-C):

[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)

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

【讨论】:

为了适应非线性范围,您需要做什么?我想将 -1..1 的范围转换为 -.25..1,其中 -.25..0..1 = -1..0..1 (所以 -0.25..0 是-1..0)。【参考方案4】:

× 2 − 1

应该做的伎俩

【讨论】:

这是我解决的解决方案的数学部分,而不是与语言相关的部分【参考方案5】:

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)

【讨论】:

我喜欢你概括你的答案的方式。我使用您的语法在 Python 中执行此操作。 +1【参考方案6】:

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

【讨论】:

以上是关于从 [0.5 - 1] 规范化到 [0 - 1]的主要内容,如果未能解决你的问题,请参考以下文章

编码规范

动画视图的 alpha 从 0 到 0.5

如何将 Web 应用程序从 JSF Mojarra 2.0.5 升级到最新的 Mojara 2.1.9

排球赛程序(个人作业)

自动驾驶新规将于5月1日施行 这些重点不要错过

悬停动画淡入不透明度 0.5 悬停不透明度 1