C++ 使用Pybind11向Python公开Eigen::Tensor

C++ 使用Pybind11向Python公开Eigen::Tensor,c++,eigen,tensor,pybind11,C++,Eigen,Tensor,Pybind11,我试图使用pybind11向python公开一个特征张量。我可以毫无问题地编译所有内容,并且可以成功地将其导入python。但是,无法将数据转换为python类型。我尝试了两种方法。一种是直接公开数据,另一种是使用映射。两者在python环境中都失败 #include <pybind11/pybind11.h> #include <pybind11/stl.h> #include <pybind11/stl_bind.h> #include <pybin

我试图使用pybind11向python公开一个特征张量。我可以毫无问题地编译所有内容,并且可以成功地将其导入python。但是,无法将数据转换为python类型。我尝试了两种方法。一种是直接公开数据,另一种是使用映射。两者在python环境中都失败

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <pybind11/stl_bind.h>
#include <pybind11/numpy.h>
#include <pybind11/eigen.h>
#include <unsupported/Eigen/CXX11/Tensor>

class myclass{

    myclass(){
        m_data = new float[m_dim1*m_dim2*m_dim3]; // Contiguous data that represents a three dimensional array
        for(int i = 0; i<m_dim1*m_dim2*m_dim3; i++)
            m_data[i] = i;

        m_tensor = Eigen::TensorMap<Eigen::Tensor<float, 3>>(m_data, m_dim1, m_dim2, m_dim3);
    }

    Eigen::TensorMap<Eigen::Tensor<float, 3>>& getDataUsingMapping() { Eigen::TensorMap<Eigen::Tensor<float, 3>> temp(m_data, m_dim1, m_dim2, m_dim3);  return temp; }
    Eigen::Tensor<float, 3>& getDataWithoutUsingMapping() { return m_tensor};


private:
    Eigen::Tensor<float, 3> m_tensor;
    // In fact, m_data, m_dim1, m_dim2, m_dim3 all are
    // read from a data file but for this example let's 
    // assume some values.
    float* m_data; 
    int m_dim1 = 2, m_dim2 = 5, m_dim3 = 10;
}


PYBIND11_MODULE(example, m) {
    py::class_<myclass>(m, "myclass")
        .def(py::init<>())
        .def("getDataUsingMapping", &myClass::getDataUsingMapping, py::return_value_policy::reference)
        .def("getDataWithoutUsingMapping", &myClass::getDataWithoutUsingMapping, py::return_value_policy::reference);
}

我尝试包含所有pybdin11包含文件,但没有解决问题。有人能帮助我吗?

< P> C++代码没有编译,Python代码不可能运行为发布,但是在修复了这些代码并进行逻辑更改之后,PybDun11不支持“未支持/特征/ CXX11/张量”的张力图。因为该类不提供与其他特征映射类相同的接口

我本以为映射器施法器的专业化会自动工作,但这样做是明确的:

template<>
struct py::detail::type_caster<Eigen::TensorMap<Eigen::Tensor<float, 3>>, void>
    : py::detail::eigen_map_caster<Eigen::TensorMap<Eigen::Tensor<float, 3>>> {};
模板
结构py::细节::类型
:py::detail::eigen_map_caster{};
未能实例化pybind11::detail::EigenProps,b/c TensorMap未使用cols/rows/stride提供其维度。因此,SFINAE防止自动生成连铸机


除了使用名为“unsupported”的目录中的标题之外,没有其他选项了吗?如果没有,最好的办法是将TensorMap的内容复制到一个numpy数组中,并在自定义的
getDataUsingMapping
中返回该数组:有几个示例说明了如何在有复制和无复制的情况下执行此操作。(除非你愿意展平张量,否则EigenProps的专门化是不起作用的,但你可以用它作为一个例子为TensorMap编写一个新的泛型caster。)

你的错误是在转换复数浮点时,我猜
complex.h
没有包括在内,即使你尝试过。你能解释一下你是如何包括所有这些模块的吗(
complex.h functional.h chrono.h
)?我的pybind11知识是因为你。感谢您在百忙之中抽出时间帮助社区。
template<>
struct py::detail::type_caster<Eigen::TensorMap<Eigen::Tensor<float, 3>>, void>
    : py::detail::eigen_map_caster<Eigen::TensorMap<Eigen::Tensor<float, 3>>> {};