27

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

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

4

6 に答える 6

65

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

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

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

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

これは線形連立方程式であり、方程式に方程式を掛けて方程式に方程式を加えることで解くこと(1)ができ-2ます。これを行うと、これを取得して方程式に代入すると、次のようになります。したがって、マップはトリックを行います。(1)(2)b = -1(2)a = 2x -> 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、それがトリックを行うマップであることがわかります。

于 2009-09-24T13:24:21.827 に答える
31

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

double normalize( double x )
{
    // I'll leave range validation up to you
    return (x - 0.5) * 2;
}
于 2009-09-24T12:30:33.433 に答える
24

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

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

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

于 2009-09-25T13:23:20.287 に答える
15

×2− 1

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

于 2009-09-24T12:29:02.193 に答える
14

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)
于 2013-06-10T17:41:14.480 に答える
0

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

于 2014-01-13T23:03:50.490 に答える