2017-08-29 20 views
0

これは本当に簡単なことだと思いますが、解決できません。私は2つのsenond order Eigen tensorsの二重収縮をしようとしています。すべてがうまく動作しますが、二重の収縮の結果はEigenタイプです:Eigen :: Tensorスカラー値への二重収縮

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 

} 

である私は、機能を必要とするか、結果の値を取得するために呼び出す、誰かが私を助けることができる願っています。

乾杯ジョナス

答えて

1

私は問題を解決していますが固有::テンソルモジュールで作業している場合、それはあまりにもあなたを助けるだろうと思います。セクションテンソル操作およびC++「自動」hereを書かれたよう

は:

テンソル演算はテンソル演算子を作成しているため、C++autoキーワードは、その直感的な意味を持っていません。あなたはautoを使用するときは、その結果としてテンソルを得る代わりに、非評価された式はありません...

のでテンソル収縮の結果は

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"; 
} 
関連する問題