2013-02-16 9 views
5

Chcąc być tak leniwy, jak to możliwe czytam w matrycy jakowektor kolumnowy z wierszem oznacza - ze std :: kumulować?

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

i starają się wykorzystać jak najwięcej bajerów STL, jak mogę.

Jedna rzecz, którą muszę zrobić, to obliczyć środki rzędu. W programowaniu C-styl, który byłby

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

w In C++, how to compute the mean of a vector of integers using a vector view and gsl_stats_mean? wyjaśnione jest, że przez wektor liczb można obliczyć wektor znaczy w jednej linii bez zawijania operatora size() na każdym kroku:

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

Czy można używać tych iteratorów przez wektor wektorów? Formularz pośredni to

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

już 1 wiersz zniknął! ale używając funkcji STL można pozbyć się również indeksu [i]? (na najwyższym poziomie to tylko kwestia zbierania środków rzędu).

Odpowiedz

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(); 
    }); 

Chociaż mój osobisty styl wiązałoby nazwanego lambda lub funkcji, ponieważ uważam, że więcej pewności dokumentowanie:

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); 
+0

Tego właśnie chciałbym wymyślić. +1 –

+0

+1. Odzyskuję komentarz w mojej odpowiedzi :) – eladidan

+0

niesamowita odpowiedź +1 :) – M3taSpl0it

1

Korzystanie boost::numeric::ublas jednak (jeśli jest to opcja):

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

Dzięki! Podobał mi się też ten z wcześniej opublikowanym for_each. Tylko z powodu braku liczników pętli –

Powiązane problemy