假设我有一个Matrix <float, Dynamic, Dynamic, RowMajor> Ain Eigen. 当我编写以下代码时:
cout << "Number of Columns of A is: "<< A.cols() << endl;
cout << "Number of Rows of A is: "<< A.rows() << endl;
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
Number of Columns of A is: 129
Number of Rows of A is: 600
Run Code Online (Sandbox Code Playgroud)
根据上面的结果,我期望当我编写以下代码时,我得到了,Exception Error但是这不会发生,并且它会打印一个值!为什么??!!
cout << A(500,140);
Run Code Online (Sandbox Code Playgroud)
m(i,j)正如 Eigen 文档中所解释的,矩阵系数可以通过或m.coeff(i,j)/ m.coeffRef(i,j)(对于特殊向量情况加上 和 )m[i]来访问。m.x(),...
现在,除非定义了或宏,否则对 'm(i,j)' 变体进行范围检查。通常,前一个宏是为“发布”版本定义的,因此在这种情况下不会执行范围检查。理由是 Eigen 是一个面向性能的库,检查是有成本的,因此仅出于调试目的启用它们是有意义的。NDEBUGEIGEN_NO_DEBUG
表格m.coeff(i,j)从不被检查。
当不执行检查时,任何调用超出范围的系数访问器的尝试都是前提条件违规,这意味着行为未定义。
一般来说,您应该尽量减少索引访问的使用,以支持更高级别的块/线性代数运算(Eigen 有很多这样的操作);你的代码将变得更紧凑、更易读(至少对于懂代数的读者来说)、更正确(越界访问的风险更小)并且(可能更快)。
| 归档时间: |
|
| 查看次数: |
895 次 |
| 最近记录: |