2017-05-02 10 views
0

고유 벡터가 있습니다. 나는 재귀 적으로 cat하고 싶다. recursively cat Eigen의 벡터

Eigen::Vector3d vec; 
vec << 5, 6, 7; 
Eigen::VectorXd vecCat; 
for(int i=0;i<3;i++) 
     vecCat << vec(i),0,0; 
cout<<vecCat<<endl; 

예를

이처럼 최종 출력은 내가 위의 방법을 할 경우 5 0 0 6 0 0 7 0 0

내가 오류를 얻고있다 = vecCat 될 것이라고. 누구든지 나를 도울 수 있습니까?

+1

만약 내가 잘못하지, 아이겐에서 "<<"부분적으로 벡터를 채울 수 없습니다. 내가 볼 수있는 유일한 방법은 for 루프와 [] /() 연산자를 사용하는 것이다. –

+1

@Dark_Daiver 이론 상으로는 할 수 있지만, CommaInitializer의 반환 값을 변수에 저장해야한다. 이것에 대해 상세히 설명하는 것은 의도하지 않았으며 미래의 증거가 보장되지 않기 때문에). 그리고 여러분이 말했듯이, 루프와'[]'연산자를 사용하는 것이 훨씬 쉽습니다. (또는 3x3 임시 매트릭스에 저장하고 다시 벡터에 매핑) – chtz

+0

제안한 솔루션에 대해 자세히 설명해 주시겠습니까? 나는 또한 초심자이기 때문에 명확하게 이해할 수 없다. – kaush

답변

1

내가 의견에서 말했듯이, 나는 어떻게 반복적으로 CommaInitializer을 사용할 수 있는지 설명하지 않을 것이다. 그러나 여기 해결책이 Eigen::Map을 사용하고 있습니다 : row(0)이 모든 것이

Eigen::Vector3d vec; 
vec << 5,6,7; 
Eigen::VectorXd vecCat = Eigen::VectorXd::Zero(9); // result vector 
{ 
    // map vector to 3x3 matrix: 
    Eigen::Map<Eigen::MatrixXd> map(vecCat.data(), 3,3); 
    map.row(0) = vec.transpose(); // set top elements to elements of vec 
} 
std::cout << vecCat.transpose() << '\n'; 

경우 map에서 수정해야 당신은 양자 택일 할 수있는 쓰기 (대신 { } 블록의) :

Eigen::MatrixXd::Map(vecCat.data(), 3, 3).row(0) = vec.transpose(); 
+0

참으로 도움이 된 감사합니다. – kaush