2017-05-02 50 views
0

我有一個本徵矢量。我想要遞歸地捕捉它。例如遞歸貓在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; 

,使得最終輸出將是 vecCat = 5 0 0 6 0 0 7 0 0

如果我做上述方式我正在一個錯誤。誰能幫我?

+1

如果我沒有記錯的話,在本徵你不能用「<<」部分填充矢量。只有我看到的方法是使用簡單的for循環和[] /()運算符 –

+1

@Dark_Daiver理論上可以,但是您需要將'CommaInitializer'的返回值存儲在一個變量中(我不是詳細闡述這一點,因爲這不是有意的,也不保證是未來的證明)。正如你所說,使用循環和'[]'運算符要容易得多。 (或者,將其存儲在3x3臨時矩陣中並將其映射回矢量) – chtz

+0

您能否詳細說明您提出的兩種解決方案?我也無法清楚地瞭解我是初學者。 – kaush

回答

1

正如我在評論中所說的,我不會解釋如何反覆使用CommaInitializer。但這裏是一個解決方案使用Eigen::Map

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'; 

如果row(0)是你需要的一切在map修改則可以選擇(而不是{ }塊)寫:

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

感謝chtz確實非常有幫助 – kaush