float の (大きな) 配列をヒービングしています。各 float には 4 バイトが必要です。
float の範囲が 0 から 255 の間であるという事実を考慮して、各 float を4 バイト未満で格納する方法はありますか?
配列全体に対して任意の量の計算を実行できます。
私はCを使用しています。
float の (大きな) 配列をヒービングしています。各 float には 4 バイトが必要です。
float の範囲が 0 から 255 の間であるという事実を考慮して、各 float を4 バイト未満で格納する方法はありますか?
配列全体に対して任意の量の計算を実行できます。
私はCを使用しています。
データの絶対範囲はそれほど重要ではありません。必要な精度です。たとえば、6桁の精度で問題を解決できる場合は、1〜1000000の整数を格納するために必要なだけのストレージが必要です。これは、20ビットです。したがって、これを想定すると、あなたができることは次のとおりです。
1)最小の要素の値が0になるようにデータをシフトします。つまり、すべての要素から1つの値を減算します。このシフトを記録します。
2)整数に切り捨てた後、必要な精度が失われないように、データをちょうど十分な大きさの数値でスケーリング(乗算)します。
3)データを便利な8ビットまたは16ビット単位にパックできない限り、これは難しいかもしれません。つまり、データを連続する符号なし整数にパックします。この例では、各データ値に20ビットが必要です。したがって、値1は整数1の最初の20ビットを占め、値2は整数1の残りの12ビットと整数2の最初の8ビットを占めます。この架空のケースでは、最終的に最大40%節約できます。
4)さて、「復号化」。値を解凍し(それぞれのビット数を保存しました)、スケールを解除し、シフトを解除します。
したがって、これはそれを行い、標準の圧縮アルゴリズムよりも高速でコンパクトになる可能性があります。これは、必要な精度についての仮定を行うことが許可されていないためですが、あなたはそうです。
どのくらいの精度が必要ですか?
unsigned short
各 float を(0 ~ 65,535の範囲) として表し2^8
、実際の値が必要なときにすべての値を で割ることにより、2 バイトで格納できます。これは、浮動小数点の代わりに固定小数点形式を使用することと本質的に同じです。
ただし、精度は1.0 / (2^8) = 0.00390625
これを行う場合に限られます。
たとえば、整数 (.0 の float) を 1 バイトに格納できますが、もう 1 つの float にはより多くのバイトが必要です。
精度を気にしない場合は、固定小数点を使用することもできます...