2016-11-28 3004 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); 

這樣參數的時內存重複使用。

+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); 
相關問題