连接(叠加)Eigen :: Tensors来创建另一个张量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连接(叠加)Eigen :: Tensors来创建另一个张量相关的知识,希望对你有一定的参考价值。

我想将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循环以实现我想要的,但我想知道库中是否有方法。此外,优选的是可以避免数据复制并且数据可以从源移动到目标张量的解决方案,因为之后我将不再需要单独的2D张量。

答案

concatenate返回一个可以在以后评估的表达式。如果要强制评估并分配给u,可以执行以下操作:

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

以上是关于连接(叠加)Eigen :: Tensors来创建另一个张量的主要内容,如果未能解决你的问题,请参考以下文章

识别 Eigen 中的临时对象创建

如何创建 Eigen::Ref 的向量

PyTorch学习笔记之Tensors 2

将 Eigen 数组从 c++ 传输到 python 时的地址更改

从 std::vector 创建 Eigen::Ref

如何从双指针数组创建 Eigen::VectorXd