2016-11-15 11 views
0

することでコンパイルした後、何らかの理由で私のためにワンセグ障害を次:同じ長さのランク1の2つのテンソル間の内積を行うことになっている次のsegfaultはなぜですか?

g++ 1.cpp -I/path_to_eigen/eigen -std=c++0x 

(ひいてはランク1のテンソルを与え、寸法1)。

#include <Eigen/Core> 
#include <unsupported/Eigen/CXX11/Tensor> 
#include <iostream> 
#include <array> 

using namespace Eigen; 
using namespace std; 


int main() 
{ 
     Eigen::Tensor<double, 1> tensor(5); 
     Eigen::Tensor<double, 1> tensor2(5); 

     std::array<Eigen::IndexPair<int>, 1> product_dims = { IndexPair<int>(0, 0) }; 

     Eigen::Tensor<double, 1> tensor3(1); 

     tensor3 = tensor.contract(tensor2, product_dims); 
} 

注:私は

 auto v = tensor.contract(tensor2, product_dims); 

 tensor3 = tensor.contract(tensor2, product_dims); 

を変更した場合、それはコンパイルし、セグメンテーションフォルトなしで実行されますが、私はvはどのタイプかわかりません!マニュアルに、ここで指定したように私は、それがランク1と次元1のテンソルする必要があります。

https://github.com/RLovelett/eigen/blob/master/unsupported/Eigen/CXX11/src/Tensor/README.md

Similarly, the inner product of 2 1d tensors (through contractions) returns a 1d tensor.

EDIT:以下は、アサーション・エラーを与える:

#include <Eigen/Core> 
#include <unsupported/Eigen/CXX11/Tensor> 
#include <iostream> 
#include <array> 

using namespace Eigen; 
using namespace std; 


int main() 
{ 
     Eigen::Tensor<double, 1> tensor(5); 
     Eigen::Tensor<double, 1> tensor2(5); 

     tensor.setConstant(1); 
     tensor2.setConstant(2); 
     tensor(1) = 1; 
     tensor2(1) = 2; 

     std::array<Eigen::IndexPair<int>, 1> product_dims = { IndexPair<int>(0, 0) }; 

     Eigen::Tensor<double, 1> tensor3(1); 

     tensor3.setConstant(0); 

     auto v = tensor.contract(tensor2, product_dims); 

     cerr<<v<<endl; 

     tensor3 = tensor3 + v; 

     cerr<<tensor3<<endl; 
} 

私は現在、v tensor3を直接代入するのではなく、tensor3 = tensor3 + vを使用します。

エラーは次のとおりです。

Assertion failed: (dimensions_match(m_leftImpl.dimensions(), m_rightImpl.dimensions())), function TensorEvaluator, file /Users/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h, line 355. 

答えて

1

ドキュメントが古いです。 RankL + RankR - 2 * CDimsここで、RankLは最初の入力テンソルのランク、RankRは2番目の入力テンソルのランク、CDimsは縮小された次元の数です。 。

あなたの例では、結果のランクは0です。Eigen::Tensor<double, 0> tensor3 = tensor.contract(tensor2, product_dims);

関連する問題