我Eigen::Tensor<std::complex, 2>对张量更大的张量进行了一些操作。是否有一种简单的方法可以Eigen::MatrixXcf从此Tensor对象创建,还是必须手动复制值?
我当前使用的是Eigen版本3.3.4,在Eigen :: Tensor类型和更熟悉的Matrix或Array类型之间没有容易转换的内置函数。拥有诸如.matrix()或.array()方法之类的东西会很方便。
也没有通过插件机制添加此类方法的简便方法,因为Tensor模块似乎不支持插件。如果有人知道如何请发表评论。
同时,可以使用Map函数做出相当有效的解决方法。以下在C ++ 14中的作品用于将张量转换为矩阵或从矩阵转换张量
#include <unsupported/Eigen/CXX11/Tensor>
#include <iostream>
template<typename T>
using MatrixType = Eigen::Matrix<T,Eigen::Dynamic, Eigen::Dynamic>;
template<typename Scalar,int rank, typename sizeType>
auto Tensor_to_Matrix(const Eigen::Tensor<Scalar,rank> &tensor,const sizeType rows,const sizeType cols)
{
return Eigen::Map<const MatrixType<Scalar>> (tensor.data(), rows,cols);
}
template<typename Scalar, typename... Dims>
auto Matrix_to_Tensor(const MatrixType<Scalar> &matrix, Dims... dims)
{
constexpr int rank = sizeof... (Dims);
return Eigen::TensorMap<Eigen::Tensor<const Scalar, rank>>(matrix.data(), {dims...});
}
int main () {
Eigen::Tensor<double,4> my_rank4 (2,2,2,2);
my_rank4.setRandom();
Eigen::MatrixXd mymatrix = Tensor_to_Matrix(my_rank4, 4,4);
Eigen::Tensor<double,3> my_rank3 = Matrix_to_Tensor(mymatrix, 2,2,4);
std::cout << my_rank3 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这同样适用于复杂类型。
不幸的是,这些函数仅采用张量,而不采用张量运算。例如,这不起作用:
Eigen::MatrixXd mymatrix = Tensor_to_Matrix(my_rank4.shuffle(Eigen::array<long,4>{1,0,3,2}), 4,4);
Run Code Online (Sandbox Code Playgroud)