2017-06-20 3 views
1
に固有:: TensorMap変換

それは割り当てによってMatrixEigen::Mapを変換することが可能です:固有::テンソル

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; 

私は単純にコンパイラエラーを取得します。。 TensorMapをTensorに変換する方法はありますか?

答えて

2

まあ、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); 
}