2016-11-28 88 views
1

std::vector<double> paramの長さは(n + n * n)であり、最後の(n * n)要素をMatrixXdに移動する必要があります。私はこのようにしました:C++:std :: vectorをEigen :: MatrixXdに変換する方法は?

MatrixXd cov(n, n); 
for(int i = 0 ; i < n ; ++i) { 
    for(int c = 0 ; c < n ; ++c) { 
     cov(i, c) = param(n + i * n + c); 
    } 
} 

これを行うには良い方法はありますか?

編集:より速く、より良い手段;)

答えて

1

あなたはベクトルが連続し、その要素を格納することを保証する場合は、最も簡単かつ最速の方法は以下の通りである。このように

std::vector<double> param; 
//code// 
. 
. 
. 
//code// 
double *v = &param[n]; 
Eigen::Map<Eigen::MatrixXd> matrix(v,n + n * n,1); 

のparamのメモリがあります再利用される。

+0

std :: vectorsは常に要素を連続してメモリに保存します – Jonas

+0

ありがとうございます!実際には動作していますが、実際には次のようになります。 'double * v =&param(n); Eigen :: Map 行列(v、n、n); ' – Poia

1

Roger's answerは良いですが、ベクトル化を利用したい場合は、Eigen::Mapは整列しているかどうかわからないのでベクトル化しません。必要ならば、コピーのデータを作成するだけでなく、そのデータをコピーする必要があります。

Eigen::MatrixXd copiedMatrix = Eigen::Map<Eigen::MatrixXd>(&param[n], n, n); 
関連する問題