5

-1.396655toの間の範囲の double のリストがあり、1.74707それより高くても低くてもかまいません。どちらの方法でも、正規化する前にMinandのMax値を知ることができます。私の質問は、これらの値を-1toの間で正規化する方法、1または double 値から to の char 値に変換する方法です0255

どんな助けでも大歓迎です。

double range = (double)(max - min);
value = 255 * (value - min)/range
4

4 に答える 4

5

フォームのマッピングが必要であり、とy = mx + cを見つける必要があります。2つの固定データポイントがあります。mc

 1 = m * max + c
-1 = m * min + c

そこから、それは単純な代数です。

于 2012-04-29T22:40:19.633 に答える
3

最も簡単な方法は、最初にすべての値をシフトして、各数値からMinを引くことにより、minが0になるようにすることです。次に、255 /(Max-Min)を掛けて、シフトされたMaxが255にマップされ、他のすべてが線形にスケーリングされるようにします。したがって、あなたの方程式は次のようになると思います。

newval = (unsigned char) ((oldval - Min)*(255/(Max-Min)))

charにキャストする前に、もう少し慎重に丸めることをお勧めします。

于 2012-04-29T22:42:25.213 に答える
2

行う変更は 2 つあります。

まず、制限として 256 を使用します。

次に、256 にならないように、範囲をわずかに縮小してください。

    public int GetRangedValue(double value, double min, double max)
    {
        int outputLimit = 256;

        double range = (max - min) - double.Epsilon; // Here we shorten the range slightly

        // Then we build a range such that value >= 0 and value < 1
        double rangedValue = (value - min) / range;

        return min + (int)(outputLimit * rangedValue);
    }

これら 2 つの変更により、出力で正しい分布が得られます。

于 2019-07-14T03:01:35.503 に答える