我在GSL上使用了'mean'函数,事实证明它比我天真的实现更准确。我没有找到'sum'函数,我使用'mean'* N代替,但我认为如果我使用适当的求和函数会更清晰。
我总结了大量的数字,我想知道这是为了避免在可能的情况下实现稳定的求和算法。
提前致谢。
答案 0 :(得分:1)
有时使用的一个技巧是使用cblas_ddot
函数并使用1的向量计算数据的点积。这将有效地计算您的数据总和。
答案 1 :(得分:1)
简短回答:更好的求和方法是Kahan summation algorithm。 This answer更正说明了
“它具有与天真求和相同的算法复杂度;它将极大地提高求和的准确性。”,并且还给出了C ++中的实现。
只有当阵列的元素在数量上有很大差异或者你真的需要原则上可以提供的16位精度时(罕见情况),才需要Kahan求和。所以,在用C编码kahan求和之前,你应该做一些检查。鉴于gsl_stats_mean
的GSL实施是
(GSL 1.16源代码)
/* Compute the arithmetic mean of a dataset using the recurrence relation
mean_(n) = mean(n-1) + (data[n] - mean(n-1))/(n+1) */
long double mean = 0;
size_t i;
for (i = 0; i < size; i++)
{
mean += (data[i * stride] - mean) / (i + 1);
}
我无法立即看到,如果您的数字确实在数量上存在很大差异,那么这将避免精度损失(在您的高变数和平均值之间有一个直接的总和,它的幅度发展缓慢。)。一个好的检查是在使用你的天真实现/ gsl计算总和/平均值之前对数组进行排序。
编辑1:警告,如果优化已开启,c = (t - sum) - y
可能会优化为c = 0
。