Tensor不会在超出范围的索引上抛出异常

时间:2018-06-13 05:16:12

标签: c++ eigen

这里我创建一个1乘1的张量。我尝试访问并设置一个数字在(1,0)和(0,1)两个都超出范围索引。我期待得到一个断言或异常错误。

Eigen::Tensor<int,2> data(1,1);
auto n1 = data(1,0);
data(0,1) = 1;

但它运行得很好。但是如果我尝试用相同形状的矩阵做同样的事情,我会得到一个断言错误。

Eigen::Matrix<int,1,1> matrix;
auto n2 = matrix(1,0); // Signal: SIGABRT (Aborted)
matrix(0,1) = 1; // same error here

检查Eigen标头,我看到张量实现会检查这样的索引(虽然我不知道它是如何工作的):

bool checkIndexRange(const array<Index, NumIndices>& indices) const
{

  // ...

  return
    // check whether the indices are all >= 0
    array_apply_and_reduce<logical_and_op, greater_equal_zero_op>(indices) &&
    // check whether the indices fit in the dimensions
    array_zip_and_reduce<logical_and_op, lesser_op>(indices, m_storage.dimensions());
// m_storage.dimensions() evaluates to {1,1}
}

矩阵实现使用以下代码检查索引:

eigen_assert(row >= 0 && row < rows()
          && col >= 0 && col < cols());

我检查了Eigen文档here,但它没有说明超出范围的行为。我的问题是:当我在张量中访问超出范围的数字时,为什么我没有得到超出范围的断言错误?

编辑:我的Eigen版本是3.3.90

1 个答案:

答案 0 :(得分:2)

Tensor模块似乎只在这里rmvirtualenv venv mkvirtualenv -p python2 venv workon venv pip install -r requirements.txt # or pip install ipython ,而不是核心模块的eigen_internal_assert。要激活内部断言,您需要使用eigen_assert进行编译 - 这可能会显着降低Eigen的速度(当然,这取决于您正在做什么)。