次のようなバイトの2次元配列があります。
int n = 100000;
int d = 128;
byte[][] samples = new byte[n][d]
/* proceed to fill samples with some delicious data */
byte[] mean = new byte[d];
findMean(mean,samples);
私の findMean 関数は、次のような平均を埋めます。
mean[k] = mean(samples[:][k])
これまでのところ十分に単純です。問題は、オーバーフローの問題により、この平均関数は単純に合計と除算を行うことができないことです。したがって、私の現在の試みは、移動平均を計算することです。その主力は次のようになります。
for(int i = 0; i < samples.length; i++){
byte diff = samples[i][k] - mean[k]
mean[k] = (byte)((double)mean[k] + (Math.round( (double) ( diff ) / (double) (i + 1) )))
これはまったく機能しません。ラウンドごとに精度が低下するため、平均値が正しい値からかなり離れています。これは、1000個のランダムサンプルの小さな(したがって計算可能な)セットで検証しました。
また、最初にバイト配列を使用して回避しようとしているメモリの問題が原因で、大きなプロキシ float 配列を割り当てて真の平均を計算し、後でバイトにキャストすることはまったく不可能です。
このデータをチャンクでロードすることは...可能ですが、最終的な代替手段を考えていますが、とにかく、それは問題をチャンクサイズに置き換えるだけですか?
とにかく、実行中のアルゴリズムを使用してバイト配列の平均を正確に計算し、オーバーフローの問題を回避します。ここに良い解決策はありますか?
乾杯