web-dev-qa-db-ja.com

[0.5-1]から[0-1]への正規化

私はここでちょっと立ち往生しています、私はそれが少し頭の体操だと思います。 0.5から1の範囲の数値がある場合、0から1の範囲に正規化するにはどうすればよいですか?

助けてくれてありがとう、たぶん私は過去24時間まっすぐO_Oで働いていたので、少し遅いかもしれません

27
tweetypi

他の人はあなたに公式を提供しましたが、仕事はしませんでした。このような問題に取り組む方法は次のとおりです。答えを知るよりも、これの方がはるかに価値があると思うかもしれません。

[0.5, 1][0, 1]にマッピングするには、x -> ax + bの形式の線形マップを探します。エンドポイントがエンドポイントにマップされ、その順序が保持されている必要があります。

方法1:エンドポイントがエンドポイントにマップされ、その順序が保持されるという要件は、0.50にマップされ、11にマップされることを意味します。

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

これは線形方程式の同時システムであり、方程式(1)-2を乗算し、方程式(1)を方程式(2)に追加することで解くことができます。これを行うと、b = -1が得られ、これを方程式(2)に代入すると、a = 2が得られます。したがって、マップx -> 2x - 1がそのトリックを実行します。

方法2: 2つの点(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がトリックを実行するマップであることがわかります。

65
jason

0.5を引き(0から0.5の新しい範囲を与える)、次に2を掛けます。

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

別の一般的な答えを追加します。

線形範囲[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]

これを1つの式に組み合わせると、次のようになります。

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

非線形範囲を調べることも興味深いです。同じ手順を実行できますが、線形範囲を非線形範囲に変換するために追加の手順が必要です。

24
Toon Krijthe

×2− 1

トリックを行う必要があります

15
Glenner003

Lazyweb answer: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)
14
meetar

最終的な値が0から1の間であることを確認するために、数学内で常にクランプまたは飽和を使用できます。最後に飽和するものもありますが、計算中にも飽和するのを見ました。

0
Whitney Imura