Eigen 中的正确索引

The correct indexation in Eigen

假设我在 Eigen 中有一个 Matrix <float, Dynamic, Dynamic, RowMajor> A。当我编写以下代码时:

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);

如 Eigen 文档中所述,可以通过 m(i,j)m.coeff(i,j)/m.coeffRef(i,j) 访问矩阵系数(加上 m[i]m.x(),...特殊向量案例)。

现在,'m(i,j)' 变体 范围检查 除非 NDEBUGEIGEN_NO_DEBUG 定义了宏。通常,前一个宏是为 'release' 构建定义的,因此在这种情况下不会执行范围检查。理由是 Eigen 是一个面向性能的库,检查是有成本的,所以启用它们仅用于调试目的是有意义的。

从未检查 m.coeff(i,j) 表单。

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

一般来说,您应该尽量减少索引访问的使用,以支持更高级别的 block/linear 代数运算(Eigen 有很多);您的代码将变得更紧凑、更易读(嗯,至少对于代数感知 reader)、更正确(越界访问的风险更小)并且(可能)更快。