将 Eigen::TensorMap 转换为 Eigen::Tensor
Convert an Eigen::TensorMap to Eigen::Tensor
可以通过赋值将 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?
好吧,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::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?
好吧,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);
}