Конкатенация (стек) Eigen :: Tensors для создания другого тензора - PullRequest
1 голос
/ 06 марта 2019

Я хочу объединить или сложить 3 2D-тензора в 3D-тензор.Как это сделать в Eigen :: Tensor?

Код:

#include <iostream>
#include <CXX11/Tensor>

int main()
{
    Eigen::Tensor<float, 3> u(4, 4, 3);
    Eigen::Tensor<float, 2> a(4,4), b(4,4), c(4,4);
    a.setValues({{1, 2, 3, 4},     {5, 6, 7, 8},     {9, 10, 11, 12},  {13, 14, 15, 16}});
    b.setValues({{17, 18, 19, 20}, {21, 22, 23, 24}, {25, 26, 27, 28}, {29, 30, 31, 32}});
    c.setValues({{33, 34, 35, 36}, {37, 38, 39, 40}, {41, 42, 43, 44}, {45, 46, 47, 48}});
    u.concatenate(a, 0);
    u.concatenate(b, 0);
    u.concatenate(c, 0);

    std::cout<<u<<std::endl;
}

Вывод, который я получаю:

0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0

Что я делаю не так?Конечно, я могу установить вложенные циклы для достижения желаемого, но я хотел знать, есть ли способ в библиотеке.Кроме того, предпочтительным было бы решение, при котором можно избежать копирования данных и переместить данные из источника в целевой тензор, поскольку впоследствии мне больше не понадобятся отдельные 2D-тензоры.

1 Ответ

2 голосов
/ 06 марта 2019

concatenate возвращает выражение, которое может быть оценено позже.Если вы хотите форсировать оценку и присвоить u, вы можете сделать следующее:

u = a.concatenate(b, 0).eval().concatenate(c, 0).
        reshape(Eigen::Tensor<float, 3>::Dimensions(4, 4, 3));
...