将 Eigen::TensorMap 转换为 Eigen::Tensor

Joe*_*ini 4 c++ eigen eigen3 tensorflow

可以通过赋值将Eigen::Mapa转换为 a 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;
Run Code Online (Sandbox Code Playgroud)

这产生:

 1 2
 3 4
Run Code Online (Sandbox Code Playgroud)

如果我尝试用 a 做类似的事情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;
Run Code Online (Sandbox Code Playgroud)

我只是得到编译器错误YOU_MADE_A_PROGRAMMING_MISTAKE。有没有办法将 TensorMap 转换为 Tensor?

Hen*_*nke 6

好吧,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);
}
Run Code Online (Sandbox Code Playgroud)

使用 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);
}
Run Code Online (Sandbox Code Playgroud)