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)' 变体 是 范围检查 除非 NDEBUG
或 EIGEN_NO_DEBUG
定义了宏。通常,前一个宏是为 'release' 构建定义的,因此在这种情况下不会执行范围检查。理由是 Eigen 是一个面向性能的库,检查是有成本的,所以启用它们仅用于调试目的是有意义的。
从未检查 m.coeff(i,j)
表单。
当不执行检查时,任何调用超出范围的系数访问器的尝试都是前提条件违反,这意味着行为未定义。
一般来说,您应该尽量减少索引访问的使用,以支持更高级别的 block/linear 代数运算(Eigen 有很多);您的代码将变得更紧凑、更易读(嗯,至少对于代数感知 reader)、更正确(越界访问的风险更小)并且(可能)更快。
假设我在 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)' 变体 是 范围检查 除非 NDEBUG
或 EIGEN_NO_DEBUG
定义了宏。通常,前一个宏是为 'release' 构建定义的,因此在这种情况下不会执行范围检查。理由是 Eigen 是一个面向性能的库,检查是有成本的,所以启用它们仅用于调试目的是有意义的。
从未检查 m.coeff(i,j)
表单。
当不执行检查时,任何调用超出范围的系数访问器的尝试都是前提条件违反,这意味着行为未定义。
一般来说,您应该尽量减少索引访问的使用,以支持更高级别的 block/linear 代数运算(Eigen 有很多);您的代码将变得更紧凑、更易读(嗯,至少对于代数感知 reader)、更正确(越界访问的风险更小)并且(可能)更快。