2013-02-16 9 views
5

In dem Bemühen, so faul wie möglich zu sein, die ich in einer Matrix alsSpaltenvektor mit Zeile bedeutet - mit Std :: Accumulate?

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

und versuchen, so viele STL Leckereien wie möglich zu nutzen.

Eine Sache, die ich als nächstes tun muss, ist die Zeilenmittel zu berechnen. In C-Stil-Programmierung das wäre

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 In C++, how to compute the mean of a vector of integers using a vector view and gsl_stats_mean? wird erläutert, dass für einen Vektor von Zahlen können Sie ein Vektor in einer Zeile bedeuten berechnen, ohne die Größe() Operators bei jedem Schritt Aufruf:

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

Ist es möglich, diese Iteratoren über einen Vektor von Vektoren zu verwenden? Ein Zwischenformular ist

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

bereits 1 Zeile weg! aber mit STL-Funktionen ist es auch möglich, den [i] Index loszuwerden? (Auf der obersten Ebene ist es nur eine Frage der Sammlung der Zeile bedeutet).

Antwort

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

Obwohl mein persönlicher Stil würde ein Namen Lambda oder Funktion, weil ich, dass mehr selbsterklärend finden würde:

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

Das ist, was ich wünschte, ich hätte darüber nachgedacht. +1 –

+0

+1. Ich nehme den Kommentar in meiner Antwort zurück :) – eladidan

+0

ehrfürchtige Antwort +1 :) – M3taSpl0it

1

boost::numeric::ublas jedoch verwenden (wenn es eine Option):

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

Danke! Ich mochte aber auch den mit foreach geposteten. Nur für das Fehlen von Loop-Counter –

Verwandte Themen