我该怎么办张量的外积的本征?(How do I do outer product of tensor

2019-09-27 04:43发布

在本征,可以用做很容易张量收缩:

Tensor<double, 1> tensor1;
Tensor<double, 2> tensor2;

// fill with data so that
// tensor1 is of dimensions [10] and tensor2 of dimensions [5,10]

std::array<Eigen::IndexPair<int>, 1> product_dims1 = { IndexPair<int>(1, 0) };

auto tensor = tensor2.contract(tensor1, product_dims1);

// now tensor is of dimensions [5]

我寻找,做收缩的相反,这意味着它一方法有两个张量A和B,说尺寸5×10 3和3×2的,并且限定尺寸的新张量的C 5×10×3×2,使得

  C_ijkl = A_ij * B_kl

如果必要的话,我可以轻松地写出这样的方法,但我得到的意义上,它会如果我使用的天然固有方法更加优化。 我也希望能够利用GPU的支持,如果您使用本机方法是与本征很容易的。

谢谢。

Answer 1:

该解决方案也许是太简单了:你有没有超过指数收缩

Eigen::array<Eigen::IndexPair<long>,0> empty_index_list = {};
Tensor<double, 2> A_ij(4, 4);
Tensor<double, 2> B_kl(4, 4);
Tensor<double, 4> C_ijkl = A_ij.contract(B_kl, empty_index_list);


Answer 2:

可以通过重塑输入张量填充的尺寸与另外的一维的人,然后上广播新的尺寸实现的外积。

对于两个等级2和一个秩4张量你有C_ijkl = A_ij * B_kl它会是什么样子:

#include <Eigen/Core>
#include <unsupported/Eigen/CXX11/Tensor>

using namespace Eigen;

int main() {

Tensor<double, 2> A_ij(4, 4);
Tensor<double, 2> B_kl(4, 4);
Tensor<double, 4> C_ijkl(4, 4, 4, 4);

Tensor<double, 4>::Dimensions A_pad(4, 4, 1, 1);
array<int, 4> A_bcast(1, 1, 4, 4);

Tensor<double, 4>::Dimensions B_pad(1, 1, 4, 4);
array<int, 4> B_bcast(4, 4, 1, 1);

C_ijkl = A_ij.reshape(A_pad).broadcast(A_bcast) * 
         B_kl.reshape(B_pad).broadcast(B_bcast);

}


文章来源: How do I do outer product of tensors in Eigen?
标签: c++ eigen