这是一个类的实现,包含特征矩阵向量以及 python 绑定的定义。
#include <vector>
#include <pybind11/eigen.h>
#include <Eigen/Dense>
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
namespace py = pybind11;
using EMatrixDbl = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>;
class MyMap
{
public:
MyMap(int i, int j)
{
m_matrices.resize(1);
m_matrices[0].resize(i, j);
m_matrices[0].setZero();
}
EMatrixDbl& operator[](int k)
{
return m_matrices[k];
}
EMatrixDbl& get(int k)
{
return m_matrices[k];
}
std::vector<EMatrixDbl> m_matrices;
};
PYBIND11_MODULE(MyMapPy, m) {
py::class_<MyMap> c(m, "MyMap");
c.def(py::init<int, int>());
c.def("get", &MyMap::get, py::return_value_policy::reference_internal);
c.def("get_lambda", [](MyMap& self, int k){
EMatrixDbl& m_map = self[k];
return m_map;
}, py::return_value_policy::reference_internal);
}
当我使用绑定时,只有方法
get
允许编辑矩阵。
get_lambda
不能做到同样的事情?MyMap::operator[]
,提供绑定的可写接口?import MyMapPy
m = MyMapPy.MyMap(3, 3)
m.get(0)[0,0] = 1
m.get(0) # [0,0] is 1
m.get_lambda(0)[0,0] = 2
m.get_lambda(0) # [0,0] is always 1...
lambda 函数返回类型被推导为
EMatrixDbl
而不是 EMatrixDbl&
。最简单的解决方法是指定返回类型:
[](MyMap& self, int k) -> EMatrixDbl&
结果
>>> m.get_lambda(0)[0,0]=2
>>> m.get(0)
array([[2., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
更通用的方法是将返回类型指定为
decltytpe(auto)
请参阅此答案。