Eigen中的正确索引

时间:2018-01-05 09:05:10

标签: c++ eigen

假设Matrix <float, Dynamic, Dynamic, RowMajor> A中有Eigen。当我写下面的代码时:

cout << "Number of Columns of A is: "<< A.cols() << endl;
cout << "Number of Rows of A is: "<< A.rows() << endl;

我得到以下结果:

Number of Columns of A is: 129
Number of Rows of A is: 600

根据上面的结果,我希望当我写下面的代码时,我得到Exception Error,但这不会发生,它会打印一个值!为什么?? !!

cout << A(500,140);

1 个答案:

答案 0 :(得分:4)

如Eigen docs所述,矩阵系数可以通过m(i,j)m.coeff(i,j) / m.coeffRef(i,j)(加m[i]m.x(),...来获取特殊向量情况)。

现在,'m(i,j)'变体 范围检查,除非定义了NDEBUGEIGEN_NO_DEBUG宏。通常,前一个宏是为“发布”版本定义的,因此在这种情况下不会执行范围检查。基本原理是Eigen是一个面向性能的库,检查有成本,因此只有调试才有意义。

永远不会检查m.coeff(i,j)表单。

如果没有执行检查,任何调用系数访问器超出范围的尝试都是违反前提条件的,这意味着行为未定义。

一般来说,你应该最小化索引访问的使用,以支持更高级别的块/线性代数操作(Eigen有很多);你的代码将变得更紧凑,更易读(至少,对于代数感知的读者),更正确(更少范围访问的风险)和(可能更多)更快。