2

我有一个包含大约 10'000 个元素的 double* 数组,必须从中减去平均值。这必须做很多事情。

现在我已经完成了它的愚蠢:

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;}

其中数组:double & n 的大数组是该数组的大小。我敢肯定有办法用一些花哨的字符来实现它,这会更快,我希望你们能帮助我。

干杯麻姑

4

5 回答 5

0

嗯似乎没有什么在低级别实现。

无论如何,谢谢你的回答。

于 2013-03-15T13:14:39.530 回答
0

您的解决方案对我来说看起来不错。

您可以使用std::transform,但我相信它不会使其更具可读性。

于 2013-03-15T12:23:15.040 回答
0

您可以通过保留 total_value 的活动副本来跳过每次均值的计算。如果您必须递归地从同一张表中减去平均值,那么您可以使用以下公式并找到总数。

new_total = old_total - n * prev_mean; new_mean = new_total / n;

于 2013-03-15T12:31:32.797 回答
0

如果您必须经常这样做,那么为什么不保留一个运行总数和数组中的项目数呢?

然后计算平均值的总和将是复杂度 O(1)。

于 2013-03-15T12:24:08.777 回答
0

这可以以更短的方式完成,但性能不会明显更好。使用std::accumulate来自 <algorithm>

double mean = std::accumulate(array, array + n)/double(n);

但是,您可以做的是记住第一次计算它,然后在下一次迭代中简单地(mt * n)从总和中减去(假设您在问题中显示的是迭代之间发生的修改。

于 2013-03-15T12:24:12.757 回答