为什么会出现以下段错误?

时间:2016-11-15 16:03:51

标签: c++ eigen

在编译之后,由于某些原因,以下seg出现错误:

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

它应该在相同长度的等级1的两个张量之间做一个点积(因此给出等级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);
}

注意:如果我改变

        tensor3 = tensor.contract(tensor2, product_dims);

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

然后它编译,并执行没有segfaulting,但我不知道v是什么类型!我需要它是一个等级1和维度1的张量,如文档中所述:

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

  

同样,2 1d张量的内积(通过收缩)   返回1d张量。

编辑:以下给出了断言错误:

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

我现在使用tensor3 = tensor3 + v而不是直接指定v tensor3。

错误是:

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 个答案:

答案 0 :(得分:1)

文档已过时。收缩结果的等级由以下等式给出:RankL + RankR - 2 * CDims,其中RankL是第一输入张量的等级,RankR是第二输入张量的等级,CDims是合同尺寸的数量

在您的示例中,结果的等级为0.您应该写Eigen::Tensor<double, 0> tensor3 = tensor.contract(tensor2, product_dims);