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