C++ 是否有比生成/累积更快的方法来计算函数结果的平均值?

C++ 是否有比生成/累积更快的方法来计算函数结果的平均值?,c++,return-value,mean,C++,Return Value,Mean,这是关于计算函数返回值的算术平均值 为了获得N函数调用的平均值,我想到了: std::vector<double> results(N); std::generate(results.begin(), results.end(), my_function(...)); double mean = std::accumulate(results.begin(), results.end(), 0.0) / N; std::向量结果(N); std::generate(results.

这是关于计算函数返回值的算术平均值

为了获得
N
函数调用的平均值,我想到了:

std::vector<double> results(N);
std::generate(results.begin(), results.end(), my_function(...));
double mean = std::accumulate(results.begin(), results.end(), 0.0) / N;
std::向量结果(N);
std::generate(results.begin()、results.end()、my_函数(…);
双平均值=标准::累加(results.begin(),results.end(),0.0)/N;

有标准的/现代的C++方式来更快地或省略中间向量吗?Boost也是一个选项。

您必须多次调用函数
N
,但您可以通过动态计算节省一些空间:

double mean = 0;
for (int i = 0; i < N; ++i)
    mean += my_function(...);
mean /= N;

您必须多次调用函数
N
,但在执行计算时可以节省一些空间:

double mean = 0;
for (int i = 0; i < N; ++i)
    mean += my_function(...);
mean /= N;
与:

与:


这不是平均数,而是你计算的平均数。对于这一点,你必须对所有的值求和,没有捷径可走(除非用一个近似值(可能是错误的)来代替它)。@JoachimPileborg这是平均值的定义。@JoachimPileborg是算术平均值average@JoachimPileborg也许你的“意思”是“中位数”?我想要算术平均值,也就是平均值。好吧,弄错了术语,但我其余的评论仍然有效。:)这不是平均数,而是你计算的平均数。对于这一点,你必须对所有的值求和,没有捷径可走(除非用一个近似值(可能是错误的)来代替它)。@JoachimPileborg这是平均值的定义。@JoachimPileborg是算术平均值average@JoachimPileborg也许你的“意思”是“中位数”?我想要算术平均值,也就是平均值。好吧,弄错了术语,但我其余的评论仍然有效。:)OP要求用现代C++实现这一点。手写的循环感觉不是很现代@ChrisJester Young-不,将简单的东西复杂化是非常现代的:-)通过构造没有容器的范围,基于范围的for循环将是现代的:)
ranges::accumulate(范围::视图::generate_n([]{return my_function(…);},n),0.0)/n,,FWIW@FelixDombek这是非包容性的。在每次迭代后,<>代码>状态< /Cord>对象(即计数器)在每次迭代时都会递增,因此当它等于<代码> N< /C>时,迭代器等于第二个参数:“代码> STD::Stult,它结束。OP请求一个现代C++方式来实现这一点。手写的循环感觉不是很现代@ChrisJester Young-不,将简单的东西复杂化是非常现代的:-)通过构造没有容器的范围,基于范围的for循环将是现代的:)
ranges::accumulate(范围::视图::generate_n([]{return my_function(…);},n),0.0)/n,,FWIW@FelixDombek这是非包容性的。
状态
对象(在本例中为计数器)在每次迭代后递增,因此当它变为等于
N
时,迭代器变为等于
std::acculate
的第二个参数,它完成了。这比@AntonSavin建议的解决方案快吗?@4386427-循环解决方案几乎肯定比其中任何一个都快(而且更明显)。有时,现代并不意味着更好。有时这就是其中之一。@DavidHammen显而易见,但就性能而言,它应该与一个像样的优化器相当。这比@antosavin建议的解决方案快吗?@4386427-循环解决方案几乎肯定比这两个方案中的任何一个都快(而且更明显)。有时,现代并不意味着更好。“这有时就是其中之一。”DavidHammen在旁观者眼中是显而易见的,但在性能方面,它应该与一个像样的优化器相当。
auto mean = ranges::accumulate(
                    ranges::view::generate_n([]{ return my_function(...); }, N),
                    0.0) / N;