特征不支持Tensor到特征矩阵

时间:2018-02-14 20:38:56

标签: eigen3

我在具有更多尺寸的Tensor上进行一些操作后得到Eigen::Tensor<std::complex, 2>。是否有一种简单的方法可以从此Tensor对象创建Eigen::MatrixXcf,还是必须手动复制值?

1 个答案:

答案 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);