【发布时间】:2017-10-31 16:28:45
【问题描述】:
例如,我有一个张量 A(2,3,4) 和张量 B(3,4),并且想要使 A 沿维度 0(批量维度)与 B 进行 koefs 乘法(不是收缩操作)。如何在没有 for 循环的情况下执行此操作?
【问题讨论】:
标签: eigen multiplication eigen3 tensor
例如,我有一个张量 A(2,3,4) 和张量 B(3,4),并且想要使 A 沿维度 0(批量维度)与 B 进行 koefs 乘法(不是收缩操作)。如何在没有 for 循环的情况下执行此操作?
【问题讨论】:
标签: eigen multiplication eigen3 tensor
如果我理解您的问题,您可以先将 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
【讨论】: