2017-11-05 28 views
0

this Eigen pageに行くと<<演算子でVectorXdのオブジェクトを初期化することができます。いくつかのベクトルオブジェクトを1つの大きなVectorXdオブジェクトにダンプすることもできます(たとえば、「コンマ初期化子」というセクションの3番目の例を参照してください)。`Eigen :: VectorXd`のコレクションを一つの大きな` Eigen :: VectorXd`にマージする

大きなベクトルにいくつかのベクトルをダンプしたいのですが、私は、任意の大きさのベクトルのコレクションで動作するコードを書くのに苦労しています。以下はうまくいきませんし、そういう形で書くのは苦労しています(それは二重ループではありません)。助言がありますか?

#include <iostream> 
#include <Eigen/Dense> 
#include <vector> 

int main(int argc, char **argv) 
{ 
    // make some random VectorXds 
    std::vector<Eigen::VectorXd> vOfV; 
    Eigen::VectorXd first(3); 
    Eigen::VectorXd second(4); 
    first << 1,2,3; 
    second << 4,5,6,7; 
    vOfV.push_back(first); 
    vOfV.push_back(second); 

    // here is the problem 
    Eigen::VectorXd flattened(7); 
    for(int i = 0; i < vOfV.size(); ++i) 
     flattened << vOfV[i]; 

    //shows that this doesn't work 
    for(int i = 0; i < 7; ++i) 
     std::cout << flattened(i) << "\n"; 

    return 0; 
} 
+0

あなたの言葉に少し注意する必要があります。 "固有ベクトル"は数学的な用語です(線形演算子を渡したものだけです) –

+0

@MarcusMüllerは今編集しました。うまくいけば助けてください – Taylor

+0

それは間違っています: 'i << vOfV.size()' –

答えて

1

カンマイニシャライザはそのようには機能しません。それから行列を完全に初期化する必要があります。代わりに、十分に大きなベクトルを割り当てて、ブロックを反復して割り当てます。

#include <iostream> 
#include <vector> 

#include <Eigen/Dense> 

// http://eigen.tuxfamily.org/dox/group__TopicStlContainers.html 
#include <Eigen/StdVector> 
EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Eigen::VectorXd) 

int main() 
{ 
    // make some random VectorXds 
    std::vector<Eigen::VectorXd> vOfV; 
    Eigen::VectorXd first(3); 
    Eigen::VectorXd second(4); 
    first << 1,2,3; 
    second << 4,5,6,7; 
    vOfV.push_back(first); 
    vOfV.push_back(second); 

    int len = 0; 
    for (auto const &v : vOfV) 
     len += v.size(); 

    Eigen::VectorXd flattened(len); 

    int offset = 0; 
    for (auto const &v : vOfV) 
    { 
     flattened.middleRows(offset,v.size()) = v; 
     offset += v.size(); 
    } 

    std::cout << flattened << "\n"; 
} 
関連する問題