вектор столбца с строкой означает — с std :: накопить?

Стремясь быть как можно более ленивым, я прочитал в матрице

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]? (на верхнем уровне это просто вопрос сбора ряда средств).

5

Решение

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);
11

Другие решения

С помощью boost::numeric::ublas однако (если это вариант):

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

По вопросам рекламы [email protected]