我有一个二维字节数组,如下所示:
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 个随机样本的小(因此可计算)集上验证了这一点。
此外,由于我首先试图通过使用字节数组来避免内存问题,因此分配一个大的代理浮点数组来计算真正的平均值,然后再转换为一个字节是完全不可能的。
以块的形式加载这些数据......好吧,这是可能的,但我正在考虑我的最终选择,无论如何,这只是将问题转移到块大小?
无论如何,使用运行算法准确计算字节数组的平均值以避免溢出问题。这里有好的解决方案吗?
干杯