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