2017-11-05 8 views
0

Wenn Sie zu this Eigen page gehen, können Sie VectorXd Objekte mit dem Operator << initialisieren. Sie können auch einige Vektorobjekte in ein großes VectorXd-Objekt ablegen (sehen Sie sich zum Beispiel das dritte Beispiel im Abschnitt "Der Komma-Initialisierer" an).Zusammenfassen einer Sammlung von `Eigen :: VectorXd`s zu einem großen` Eigenen :: VectorXd`

Ich möchte ein paar Vektoren in einen großen Vektor ablegen, aber es fällt mir schwer, Code zu schreiben, der für eine beliebig große Sammlung von Vektoren funktioniert. Das Folgende funktioniert nicht, und es fällt mir schwer, es so zu schreiben (das ist kein Doppel für die Schleife). Irgendwelche Vorschläge?

#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

Sie brauchen ein bisschen vorsichtig mit Ihrer Benennung sein. Ein "Eigenvektor" ist ein mathematischer Begriff (etwas, das einen linearen Operator nur skaliert passiert) –

+0

@ MarcusMüller gerade bearbeitet. hoffentlich hilft das – Taylor

+0

Das ist definitiv falsch: 'i << vOfV.size()' –

Antwort

1

Der Komma-Initialisierer funktioniert nicht so. Sie müssen die Matrix vollständig initialisieren. Ordnen Sie stattdessen einen ausreichend großen Vektor zu und iterieren Sie und weisen Sie die Blöcke zu.

#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"; 
} 
Verwandte Themen