我认为这应该是一件非常简单的事情,但我不能解决它。我试图对两个序列的本征张量进行双收缩。一切都运作良好,但双收缩的结果是Eigen
类型:
Eigen::TensorContractionOp<const std::array<Eigen::IndexPair<int>, 2ul>, const Eigen::TensorFixedSize<double, Eigen::Sizes<3l, 3l> >, const Eigen::TensorFixedSize<double, Eigen::Sizes<3l, 3l> > >
但我需要double
。我可以打印它,但我无法使用它。
代码如下
#include <iostream>
#include <unsupported/Eigen/CXX11/Tensor>
int main()
{
auto tensor1 = Eigen::TensorFixedSize<double, Eigen::Sizes<3,3>>();
tensor1.setValues({ {1, 0, 0},
{0, 1, 0},
{0, 0, 1} });
std::cout << "tensor1:\n" << tensor1 << "\n";
auto tensor2 = Eigen::TensorFixedSize<double, Eigen::Sizes<3,3>>();
tensor2.setValues({ {2, 0, 0},
{0, 2, 0},
{0, 0, 2} });
std::cout << "tensor2:\n" << tensor2 << "\n";
Eigen::array<Eigen::IndexPair<int>, 2> contraction_pair0011
= { Eigen::IndexPair<int>(0, 0), Eigen::IndexPair<int>(1, 1)};
auto tensor1_tensor2 = tensor1.contract(tensor2, contraction_pair0011);
std::cout << "tensor1 : tensor2:\n" << tensor1_tensor2 << "\n";
// double value = tensor1_tensor2; // won't compile
}
我需要一个函数或调用才能获得结果的值,希望有人可以帮助我。
干杯乔纳斯
答案 0 :(得分:2)
我解决了这个问题,但是如果你正在使用Eigen :: Tensor模块,我认为它也会有所帮助。
在 Tensor Operations和C ++&#34; auto&#34;
部分中写了here 因为Tensor操作会创建张量运算符,所以C ++ auto
关键字没有直观的含义。当您使用 auto
时,您不会获得Tensor作为结果,而是获得未评估的表达式...
因此张量收缩的结果是
Eigen::TensorContractionOp<...>
而不是我们可以获得其元素的张量。所以我们需要知道最终张量的大小。问题是结果必须是标量张量,用空Eigen::Sizes<>
Eigen::TensorFixedSize<double, Eigen::Sizes<>>
这里是正在运行的代码。我希望它有助于某人...
#include <iostream>
#include <unsupported/Eigen/CXX11/Tensor>
int main()
{
auto tensor1 = Eigen::TensorFixedSize<double, Eigen::Sizes<3,3>>();
tensor1.setValues({ {1, 0, 0},
{0, 1, 0},
{0, 0, 1} });
std::cout << "tensor1:\n" << tensor1 << "\n";
auto tensor2 = Eigen::TensorFixedSize<double, Eigen::Sizes<3,3>>();
tensor2.setValues({ {2, 0, 0},
{0, 2, 0},
{0, 0, 2} });
std::cout << "tensor2:\n" << tensor2 << "\n";
Eigen::array<Eigen::IndexPair<int>, 2> contraction_pair0011
= { Eigen::IndexPair<int>(0, 0), Eigen::IndexPair<int>(1, 1)};
Eigen::TensorFixedSize<double, Eigen::Sizes<>> tensor1_tensor2 = tensor1.contract(tensor2, contraction_pair0011);
std::cout << "tensor1 : tensor1:\n" << tensor1_tensor2 << "\n";
double t1_t2 = tensor1_tensor2(0);
std::cout << "result in double:\n" << t1_t2 << "\n";
}