这里我创建一个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
答案 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的速度(当然,这取决于您正在做什么)。