2017-07-13 2 views
1

ich so ein Eigen/dichtes Objekt in einer Struktur verwenden möchten:boost :: Python und Eigen/dichte einen Segmentation Fault erstellen

#include <boost/python.hpp> 
#include <Eigen/Dense> 
#include <iostream> 
#include <vector> 

struct data_t { 
    Eigen::Matrix2f matrix; 
    //std::vector<float> matrix; 
}; 

data_t init_data() { 
    data_t result; 
    result.matrix(0, 0) = 1.0f; 
    result.matrix(0, 1) = 2.0f; 
    result.matrix(1, 0) = 3.0f; 
    result.matrix(1, 1) = 4.0f; 
    //result.matrix.push_back(1.0f); 
    //result.matrix.push_back(2.0f); 
    //result.matrix.push_back(3.0f); 
    //result.matrix.push_back(4.0f); 
    return result; 
} 


BOOST_PYTHON_MODULE(python_test) { 

    boost::python::class_<data_t>("DataType") 
     .def("from_init", &init_data) 
     .staticmethod("from_init") 
    ; 
} 

Der Python-Code wie folgt aussieht:

import python_test 

def init_data(): 
    return python_test.DataType.from_init() 

sample = init_data() 

Die Ausführung verursacht einen Segmentierungsfehler. Meine Frage ist: Warum? Wenn ich das Eigen-Objekt durch einen std :: vector ersetze, läuft der Code gut.

+0

Die follwong funktioniert: struct data_t {Eigen :: MatrixXf Matrix;}; und: data_t init_data() { data_t Ergebnis; result.matrix = Eigen :: Matrix2f(); Ergebnis.Matrix (0, 0) = 1.0f; Ergebnis.Matrix (0, 1) = 2.0f; Ergebnis.Matrix (1, 0) = 3.0f; Ergebnis.Matrix (1, 1) = 4.0f; Ergebnis zurückgeben; } – Michael

+0

Ich vermute, das Problem ist, dass eine feste Größe Eigen-Objekt intern von Wert an eine boost :: python-Funktion während der Rückgabeanweisung übergeben wird. (http://eigen.tuxfamily.org/dox-devel/group__TopicPassingByValue.html) – Michael

+1

Sie können versuchen, statische Ausrichtung mit '-D EIGEN_MAX_STATIC_ALIGN_BYTES = 0' zu deaktivieren – chtz

Antwort

1

Das Problem ist, dass data_t enthält eine Matrix, die Eigen erwartet ausgerichtet zu sein, aber die Boost :: Python nicht auf ausgerichteten Speicher zuweisen.

Die einfachste Abhilfe ist, die Ausrichtung deaktivieren nur für diese (eine typedef machen, wenn Sie dies öfter verwenden):

struct data_t { 
    Eigen::Matrix<float, 2, 2, Eigen::DontAlign> matrix; 
}; 

Alternativ deaktivieren statische Ausrichtung alle zusammen, indem sie mit -D EIGEN_MAX_STATIC_ALIGN_BYTES=0 Kompilieren (auf den letzten Eigenversionen) oder -D EIGEN_DONT_ALIGN_STATICALLY für ältere Eigenversionen.

Eigentlich, wenn boost :: Python operator::new verwendet, um seine Objekte zuzuordnen ist, können folgende arbeiten auch:

struct data_t { 
    Eigen::Matrix2f matrix; 
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW 
};