我在具有更多尺寸的Tensor上进行一些操作后得到Eigen::Tensor<std::complex, 2>
。是否有一种简单的方法可以从此Tensor对象创建Eigen::MatrixXcf
,还是必须手动复制值?
答案 0 :(得分:4)
我目前正在使用Eigen版本3.3.4,并且在Eigen :: Tensor类型和更熟悉的Matrix或Array类型之间没有简单的内置函数。拥有类似.matrix()
或.array()
方法的东西会很方便。
add such methods via the plugin mechanism也没有简单的方法,因为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;
}
这也适用于复杂类型。
不幸的是,这些功能只采用张量,而不是张量运算。例如,这不起作用:
Eigen::MatrixXd mymatrix = Tensor_to_Matrix(my_rank4.shuffle(Eigen::array<long,4>{1,0,3,2}), 4,4);