在特征中,我们可以使用以下方法轻松地进行张量收缩:
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]
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种与收缩相反的方法,这意味着它需要两个张量 A 和 B,例如尺寸为 5 x 10 和 3 x 2,并定义一个尺寸为 5 x 10 x 3 x 2 的新张量 C,使得
C_ijkl = A_ij * B_kl
Run Code Online (Sandbox Code Playgroud)
如果需要,我可以轻松编写这样的方法,但我感觉如果我使用本机特征方法,它会更加优化。我还希望能够使用 GPU 支持,如果您使用本机方法,这对于 eigen 来说非常容易。
谢谢。
小智 0
您可以通过重塑输入张量并用额外的一维张量填充维度来实现外积,然后在新维度上广播。
对于两个 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1903 次 |
| 最近记录: |