c++11 - 连接(堆叠)Eigen::Tensors 以创建另一个张量

标签 c++11 eigen tensor eigen3

我想将 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

我做错了什么?我当然可以设置嵌套 for 循环来实现我想要的,但我想知道库中是否有办法。此外,最好的解决方案是可以避免数据复制并且可以将数据从源张量移动到目标张量,因为之后我将不再需要单独的二维张量。

最佳答案

连接返回一个可以稍后计算的表达式。如果您想强制计算并分配给u,您可以执行以下操作:

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

关于c++11 - 连接(堆叠)Eigen::Tensors 以创建另一个张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55011527/

相关文章:

c++ - 用C++17编译Eigen需要_SILENCE_CXX17_NEGATORS_DEPRECATION_WARNING定义

python - 从给定范围内的张量中删除值

c++ - 生成可以区分 ID(Foo::a()) 和 ID(Foo::b()) 的唯一标识符

C++ lambda 友元

C++ Eigen : why can one add-assign but not add for the method asDiagonal()

python - PyTorch 的张量是如何实现的?

python - Pytorch 期望每个张量大小相等

c++ - 使用 std::vector <mutex*> 调用 std::lock ()

string - 如何将字符串转换为 double 保持字符串中表示的数字完全相同

c++ - 标量类型上的 Eigen 模板无法编译固定大小的子矩阵操作