在本征,可以用做很容易张量收缩:
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的支持,如果您使用本机方法是与本征很容易的。
谢谢。
该解决方案也许是太简单了:你有没有超过指数收缩 。
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);
可以通过重塑输入张量填充的尺寸与另外的一维的人,然后上广播新的尺寸实现的外积。
对于两个等级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);
}