Развернуть низкосортное тензорное приближение до полного тензора? - PullRequest
0 голосов
/ 18 ноября 2018

На примере приближения ранга 2 к тензору 3x4x5 X, заданному как

Eigen::Tensor<double, 2> A0(3, 2);
Eigen::Tensor<double, 2> A1(4, 2);
Eigen::Tensor<double, 2> A2(5, 2);

Используется нотация, похожая на публикацию тензорных аппроксимаций низкого ранга . Каковы правильные утверждения в Eigen для восстановления X из (A0, A1, A2)?

Я дошел до:

template<typename Scalar, int Dimensions_>
struct LowRankTensor
{
    std::array<Eigen::Tensor<Scalar, 2>, Dimensions_> bases;
    Eigen::Tensor<Scalar, Dimensions_> S;
};

template<typename Scalar, int Dimension>
Eigen::Tensor<double, Dimension> Full(LowRankTensor<Scalar, Dimension> lr)
{
    Eigen::Tensor<double, Dimension> X = lr.S;
    for(int d=0; d < Dimension; d++)
    {
        Eigen::array<Eigen::IndexPair<long>, 1> outer = {Eigen::IndexPair<long>{0, 1}};
        Eigen::Tensor<double, Dimension> Xd = X.contract(lr.bases(d), outer);
        X = Xd;
    }
    return X;
}

LowRankTensor<double, 3> lr;
lr.bases = {A0, A1, A2};
lr.S = Identity<3>();
auto X = Full(lr);

Это, однако, включает в себя многочисленные копии данных. Предполагается, что lr.S инициализируется тензором идентичности.

...