私はここでちょっと立ち往生しています、私はそれが少し頭の体操だと思います。 0.5から1の範囲の数値がある場合、0から1の範囲に正規化するにはどうすればよいですか?
助けてくれてありがとう、たぶん私は過去24時間まっすぐO_Oで働いていたので、少し遅いかもしれません
他の人はあなたに公式を提供しましたが、仕事はしませんでした。このような問題に取り組む方法は次のとおりです。答えを知るよりも、これの方がはるかに価値があると思うかもしれません。
[0.5, 1]
を[0, 1]
にマッピングするには、x -> ax + b
の形式の線形マップを探します。エンドポイントがエンドポイントにマップされ、その順序が保持されている必要があります。
方法1:エンドポイントがエンドポイントにマップされ、その順序が保持されるという要件は、0.5
が0
にマップされ、1
が1
にマップされることを意味します。
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
がトリックを実行するマップであることがわかります。
0.5を引き(0から0.5の新しい範囲を与える)、次に2を掛けます。
double normalize( double x )
{
// I'll leave range validation up to you
return (x - 0.5) * 2;
}
別の一般的な答えを追加します。
線形範囲[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)
非線形範囲を調べることも興味深いです。同じ手順を実行できますが、線形範囲を非線形範囲に変換するために追加の手順が必要です。
×2− 1
トリックを行う必要があります
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)
最終的な値が0から1の間であることを確認するために、数学内で常にクランプまたは飽和を使用できます。最後に飽和するものもありますが、計算中にも飽和するのを見ました。