вектор-столбец со строкой означает с std::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();

В В C++, как вычислить среднее значение вектора целых чисел с использованием векторного представления и 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]? (на верхнем уровне это просто вопрос сбора средств строки).


person alle_meije    schedule 16.02.2013    source источник


Ответы (2)


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

Хотя мой личный стиль включал бы именованную лямбду или функцию, потому что я нашел бы это более самодокументированным:

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);
person Benjamin Lindley    schedule 16.02.2013
comment
Вот о чем я хотел бы подумать. +1 - person Andy Prowl; 17.02.2013
comment
Использование 1-й версии (после некоторого чтения вещей я могу переключиться на № 2) в github.com/amwink/bias/blob/master/cpp/fastecm/fastecm.cpp -- еще раз спасибо! - person alle_meije; 13.01.2016

Однако используя boost::numeric::ublas (если это вариант):

matrix<double> m(rows,columns);
double mean = accumulate(m.data().begin(),m.data().end(),0,std::max<double>) / (rows * columns);
person eladidan    schedule 16.02.2013
comment
Спасибо! Тем не менее, мне понравился вариант с for_each, опубликованный ранее. Просто из-за отсутствия счетчиков циклов - person alle_meije; 17.02.2013