私はここでちょっと立ち往生しています、私はそれが少し頭の体操だと思います。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:(x1, y1)
2点を通過する線の傾きは次のとおり(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]
DCである新しい範囲の長さになるように、範囲をスケーリングします。(DCを掛ける):
[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の回答:値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の間にあることを確認するために、数学内で常にクランプまたは飽和を使用できます。最後に飽和するものもありますが、計算中にも飽和するのを見ました。