5

できるだけ怠惰になるために、私はマトリックスを次のように読みました

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

できるだけ多くの STL グッズを使用するようにしてください。

次に行う必要があることの 1 つは、行の平均を計算することです。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() 演算子を呼び出さずに、1 行でベクトル平均を計算できることが説明されています。

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] インデックスも取り除くことができますか? (トップレベルでは、行の平均を収集するだけの問題です)。

4

2 に答える 2

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

ただし、私の個人的なスタイルには、名前付きのラムダまたは関数が含まれます。

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);
于 2013-02-16T22:15:44.830 に答える
1

ただし、使用boost::numeric::ublasする(オプションの場合):

matrix<double> m(rows,columns);
double mean = accumulate(m.data().begin(),m.data().end(),0,std::max<double>) / (rows * columns);
于 2013-02-16T22:14:24.620 に答える