python Eigen::Matrix包含在一个结构中,被pybind11标记为不可写

e4eetjau  于 9个月前  发布在  Python
关注(0)|答案(1)|浏览(95)

我正在使用pybind11为我的C++库创建一个使用Eigen类型的Python绑定。(Eigen::Matrix成员的Python目标类)元素,Writeable标志设置为false,因此是不可修改的。我已经设法将我的问题减少到以下MWE:

// binding.cpp
#include "Eigen/Dense"
#include "pybind11/pybind11.h"
#include "pybind11/eigen.h"

struct Example {
   Eigen::Matrix<double, 3, 1> m;
};

namespace py = pybind11;
PYBIND11_MODULE(MyBinding, m)
{
   py::class_<Example>(m, "Example")
      .def(py::init<>())
      .def_readwrite("m", &Example::m);
}

个字符
相反,当绑定以下代码时,一切都按预期工作,即在Python中调用时,f返回的值是可修改的(将Writeable标志设置为true):

Eigen::Matrix<double,3,1> f() {
   return {};
}

PYBIND11_MODULE(MyBinding, m)
{
   m.def("f", &f);
}


我错过了什么?谢谢你的帮助!

os8fio9y

os8fio9y1#

def_readwrite(⋯)def_property(⋯)的快捷方式(源代码链接),其中getter通过const-reference获取类示例。因此,生成的numpy数组不可修改。
你需要做的就是编写自定义的getter和setter函数:

namespace py = pybind11;

PYBIND11_MODULE( MyBinding, m )
{
    py::class_<Example>( m, "Example" )
        .def(py::init<>())
        .def_property( "m",
            // Getter
            []( Example const& self )
            {
                return self.m;
            },
            // Setter
            []( Example& self, Eigen::Matrix<double,3,1> const& val )
            {
                self.m = val;
            }
        )
    ;
}

字符串

**注意:**未经测试的代码,您可能需要传递额外的返回值策略参数

相关问题