2016-11-28 1 views
1

길이가 (n + n * n) 인 std::vector<double> param이 있고 MatrixXd에 마지막 (n * n) 요소를 이동해야합니다. 나는 이렇게했다 :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

: PARAM의 메모리가 이런 식으로

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); 
관련 문제