することでコンパイルした後、何らかの理由で私のためにワンセグ障害を次:同じ長さのランク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.