如何沿批量维度多个两个特征张量?

时间:2017-10-31 16:28:46

标签: eigen multiplication eigen3 tensor

例如,我有一个张量A(2,3,4)和张量B(3,4),并希望沿着维度0(批量维度)与B进行A的koefs乘法(不是收缩运算)。没有for循环吗?

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你可以先将B重塑为(1,3,4),然后使用广播来复制沿0轴的值。不知道这是否非常有效,但是它有效。

auto A = Tensor<float, 3>(2, 3, 4);
A.setValues({
    {
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
    },{
        { 10,20,30,40 },
        { 50,60,70,80 },
        { 90,100,110,120 },
    }
});

auto W = Tensor<float, 2>(3,4);
W.setValues({ 
    { 1,2,3,4 },
    { 5,6,7,8 },
    { 9,10,11,12 }
});


auto three_dims = Eigen::array<int, 3>({ 1,3,4 });
auto bcast = Eigen::array<int, 3>({ 2,1,1 });
auto X = W.reshape(three_dims).broadcast(bcast);

auto Y = A*X;

std::cout << Y << std::endl;

打印:

 1   25   81    4   36  100    9   49  121   16   64  144
 10  250  810   40  360 1000   90  490 1210  160  640 1440