我想在这样的结构中使用特征/密集物体:
#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")
;
}
python代码如下所示:
^{pr2}$执行错误导致分段。我的问题是:为什么?如果我用std::vector替换Eigen对象,代码运行良好。在
问题是
data_t
包含一个Eigen希望对齐的矩阵,但是Boost::Python无法在对齐的内存上分配该矩阵。在最简单的解决方法是仅对此禁用对齐(如果更经常使用此选项,请生成typedef):
或者,通过使用
-D EIGEN_MAX_STATIC_ALIGN_BYTES=0
(在最近的Eigen版本上)或使用-D EIGEN_DONT_ALIGN_STATICALLY
编译旧的本征版本,一起禁用静态对齐。在实际上,如果Boost::Python使用
^{pr2}$operator::new
来分配其对象,那么下面的方法也可能奏效:相关问题 更多 >
编程相关推荐