列向量与行意味着 - 与std :: accumulate?

时间:2013-02-16 22:02:41

标签: c++ vector stl mean accumulate

为了尽可能地懒惰,我在矩阵中读到了

vector< vector<double> > data ( rows, vector<double> ( columns ) );

尽量使用尽可能多的STL好吃的东西。

接下来我需要做的一件事就是计算行的意思。在C风格的编程中将是

vector<double> rowmeans( data.size() );
for ( int i=0; i<data.size(); i++ )
    for ( int j=0; j<data[i].size(); j++ )
        rowmeans[i] += data[i][j]/data[i].size();

In C++, how to compute the mean of a vector of integers using a vector view and gsl_stats_mean?中解释了对于数字向量,您可以在一行中计算向量均值,而无需在每一步调用size()运算符:

double mean = std::accumulate(stl_v.begin(), stl_v.end(), 0.0) / stl_v.size();

是否可以在向量向量上使用这些迭代器?中间形式是

vector<double> rowmeans( rows );
    for ( int i=0; i<data.size(); i++ )
        rowmeans[i] = std::accumulate(data[i].begin(), data[i].end(), 0.0) / data[i].size();

已经1行消失了!但是使用STL函数也可以摆脱[i]索引吗? (在顶层,这只是收集行的意思)。

2 个答案:

答案 0 :(得分:11)

std::transform(data.begin(), data.end(), rowmeans.begin(),
    [](std::vector<double> const& d) {
        return std::accumulate(d.begin(), d.end(), 0.0) / d.size();
    });

虽然,我的个人风格会涉及一个名为lambda或函数,因为我会发现更多自我记录:

auto Mean = [](std::vector<double> const& d) { return std::accumulate(d.begin(), d.end(), 0.0) / d.size(); };
std::transform(data.begin(), data.end(), rowmeans.begin(), Mean);

答案 1 :(得分:1)

然而,使用boost::numeric::ublas(如果它是一个选项):

matrix<double> m(rows,columns);
double mean = accumulate(m.data().begin(),m.data().end(),0,std::max<double>) / (rows * columns);