如何将 Eigen::Tensor 广播到更高的维度?

How to broadcast Eigen::Tensor to higher dimensions?

我想将一个 N 维 Eigen::Tensor 广播到一个 (N+1) 维张量来做一些简单的代数。我想不出正确的语法。

我已经尝试过就地广播,并将广播的结果分配给一个新的张量。两者都无法编译并显示大量模板错误消息(使用 Apple Clang 10.0.1 在 Mac 上编译)。我认为相关的问题是编译器找不到 .resize() 的有效重载。我已经尝试使用 std::arrayEigen::array 和 `Eigen::Tensor::Dimensions 作为维度类型进行广播操作,但 none 有效:

    srand(time(0));
    Eigen::Tensor<float, 3> t3(3, 4, 5);
    Eigen::Tensor<float, 2> t2(3, 4);
    t3.setRandom();
    t2.setRandom();
    // In-place operation
    t3 /= t2.broadcast(std::array<long, 3>{1, 1, 5}); // Does not compile
    // With temporary
    Eigen::Tensor<float, 3> t2b = t2.broadcast(Eigen::array<long, 3>{1, 1, 5}); // Does not compile either
    t3 /= t2b;

这是Eigen::Tensor不支持的东西吗?

Broadcast 的工作方式略有不同。它需要一个参数来指定张量在每个维度上应该重复多少次。这意味着参数数组长度等于张量秩,并且生成的张量与原始张量具有相同的秩。

但是,这与您最初的意图很接近:只需添加一个整形!

例如:

    Eigen::Tensor<float, 1> t1(3);
    t1 << 1,2,3;
    auto copies  = std::array<long,1> {3};
    auto shape   = std::array<long,2> {3,3};
    Eigen::Tensor<float,2> t2 = t1.broadcast(copies).reshape(shape);

应该得到一个 3 x 3 "matrix" 包含

1 2 3
1 2 3
1 2 3