2017-08-29 71 views
0

我認爲這應該是一個非常簡單的事情,但我沒有得到它解決。我試圖做兩個二元秩序特徵張量的雙重收縮。一切正常,但雙收縮的結果是一個Eigen類型: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 

} 

我需要一個函數或撥打得到結果的價值,希望有人能夠幫助我。

乾杯喬納斯

回答

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"; 
}