У меня есть двумерный массив байтов, который выглядит так:
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 случайных выборок.
Кроме того, из-за проблем с памятью, которых я пытаюсь избежать, используя в первую очередь байтовые массивы, совершенно невозможно выделить большой прокси-массив с плавающей запятой для вычисления истинного среднего значения, а затем привести к байту.
Загрузка этих данных по частям... ну, это возможно, но я считаю, что это моя последняя альтернатива, и в любом случае, это просто переносит проблему на размер куска?
Во всяком случае, точный расчет среднего значения для массива байтов с использованием работающего алгоритма, чтобы избежать проблем с переполнением. Есть ли здесь хорошее решение?
Ваше здоровье