python和Eigen/dense创建一个分段fau

2024-06-07 17:26:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在这样的结构中使用特征/密集物体:

#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对象,代码运行良好。在


Tags: fromdataincludeinitback特征result结构
1条回答
网友
1楼 · 发布于 2024-06-07 17:26:56

问题是data_t包含一个Eigen希望对齐的矩阵,但是Boost::Python无法在对齐的内存上分配该矩阵。在

最简单的解决方法是仅对此禁用对齐(如果更经常使用此选项,请生成typedef):

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

或者,通过使用-D EIGEN_MAX_STATIC_ALIGN_BYTES=0(在最近的Eigen版本上)或使用-D EIGEN_DONT_ALIGN_STATICALLY编译旧的本征版本,一起禁用静态对齐。在

实际上,如果Boost::Python使用operator::new来分配其对象,那么下面的方法也可能奏效:

^{pr2}$

相关问题 更多 >

    热门问题