使用 pybind11 进行特征矩阵参考(读/写)

问题描述 投票:0回答:1

这是一个类的实现,包含特征矩阵向量以及 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
允许编辑矩阵。

  1. 为什么
    get_lambda
    不能做到同样的事情?
  2. 如何直接绑定
    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...
c++ eigen pybind11
1个回答
0
投票

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)
请参阅此答案

© www.soinside.com 2019 - 2024. All rights reserved.