我有一个double *数组,大约有10'000个元素,必须从中减去它的平均值。这必须要做很多事情。
现在我已经完成了它退出愚蠢:
double mt = 0;
for (int i=0; i<n; i++) {mt += array[i];}
mt /= n;
for (int i=0; i<n; i++) {array[i] -= mt;}
Whereby array:double&amp;的大数组n是该Array的大小。我肯定有一些方法可以用一些花哨的角色来实现它,这会快得多,我希望你的家伙可以帮助我。
欢呼声 麻姑
答案 0 :(得分:0)
你的解决方案对我来说很好。
你可以使用std::transform
,但我相信它不会让它更具可读性。
答案 1 :(得分:0)
如果你必须经常这样做,为什么不保持一个运行总数和数组中的项目数?
然后计算平均值的总和将是复杂度O(1)。
答案 2 :(得分:0)
这可以用更短的方式完成,但性能不会明显更好。使用std::accumulate
中的<algorithm>
:
double mean = std::accumulate(array, array + n)/double(n);
然而,您可以做的是记住第一次计算它然后在下一次迭代中简单地从总和中减去(mt * n)
(假设您在问题中显示的是迭代之间发生的修改。
答案 3 :(得分:0)
每次都可以通过保留total_value的活动副本来跳过平均值的计算。如果您必须以递归方式从同一个表本身中减去均值,那么您可以使用以下公式并找到总数。
new_total = old_total - n * prev_mean; new_mean = new_total / n;
答案 4 :(得分:0)
无论如何,谢谢你的答案。