【问题标题】:Convert an Eigen::TensorMap to Eigen::Tensor将 Eigen::TensorMap 转换为 Eigen::Tensor
【发布时间】:2017-06-20 22:54:53
【问题描述】:

可以通过赋值将Eigen::Map 转换为Matrix

vector<float> v = { 1, 2, 3, 4 };
auto m_map = Eigen::Map<Eigen::Matrix<float, 2, 2, Eigen::RowMajor>>(&v[0]);
Eigen::MatrixXf m = m_map;
cout << m << endl;

这会产生:

 1 2
 3 4

如果我尝试用 Tensor 做类似的事情:

vector<float> v = { 1, 2, 3, 4 };
auto mapped_t = Eigen::TensorMap<Eigen::Tensor<float, 2, Eigen::RowMajor>>(&v[0], 2, 2);
Eigen::Tensor<float, 2> t = mapped_t;

我只是得到编译器错误YOU_MADE_A_PROGRAMMING_MISTAKE。有什么方法可以将 TensorMap 转换为 Tensor?

【问题讨论】:

    标签: c++ tensorflow eigen eigen3


    【解决方案1】:

    好吧,Eigen::RowMajor 不是Eigen::Tensor 的默认值,这意味着您没有分配给相同的类型,即YOU_MADE_A_PROGRAMMING_MISTAKE。您必须明确请求交换布局。

    #include <vector>
    #include <unsupported/Eigen/CXX11/Tensor>
    
    int main()
    {
      std::vector<float> v = { 1, 2, 3, 4 };
      auto mapped_t = Eigen::TensorMap<Eigen::Tensor<float, 2, Eigen::RowMajor>>(&v[0], 2, 2);
      Eigen::Tensor<float, 2> t = Eigen::TensorLayoutSwapOp<Eigen::Tensor<float, 2, Eigen::RowMajor>>(mapped_t);
    }
    

    使用 C++14,您可以为此编写一个很好的实例化函数。

    #include <type_traits>
    #include <vector>
    #include <unsupported/Eigen/CXX11/Tensor>
    
    namespace Eigen {
      template < typename T >
      decltype(auto) TensorLayoutSwap(T&& t)
      {
        return Eigen::TensorLayoutSwapOp<typename std::remove_reference<T>::type>(t);
      }
    }
    
    int main()
    {
      std::vector<float> v = { 1, 2, 3, 4 };
      auto mapped_t = Eigen::TensorMap<Eigen::Tensor<float, 2, Eigen::RowMajor>>(&v[0], 2, 2);
      Eigen::Tensor<float, 2> t = Eigen::TensorLayoutSwap(mapped_t);
    }
    

    【讨论】:

    • 我收到一些类似这样的错误:静态 Eigen::PlainObjectBase::MapType Eigen::PlainObjectBase::Map(Eigen::PlainObjectBase::Scalar*) [与 Derived = Eigen::Matrix; Eigen::PlainObjectBase::MapType = Eigen::Map<:matrix float>, 0, Eigen::Stride >; Eigen::PlainObjectBase::Scalar = const float]' 不能重载
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多