本征不受支持的张量到本征矩阵

Noz*_*rum 3 eigen3

Eigen::Tensor<std::complex, 2>对张量更大的张量进行了一些操作。是否有一种简单的方法可以Eigen::MatrixXcf从此Tensor对象创建,还是必须手动复制值?

Dav*_*Ace 5

我当前使用的是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)