【问题标题】:column vector with row means -- with std::accumulate?带有行的列向量 - 带有 std::accumulate?
【发布时间】:2013-02-16 22:02:40
【问题描述】:

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

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] 索引? (在顶层这只是收集行均值的问题)。

【问题讨论】:

    标签: c++ vector stl mean accumulate


    【解决方案1】:
    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);
    

    【讨论】:

    【解决方案2】:

    但是使用boost::numeric::ublas(如果可以的话):

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

    【讨论】:

    • 谢谢!不过,我确实喜欢之前发布的带有 for_each 的那个。只是因为缺少循环计数器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多