На примере приближения ранга 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
инициализируется тензором идентичности.