假设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);
答案 0 :(得分:4)
如Eigen docs所述,矩阵系数可以通过m(i,j)
或m.coeff(i,j)
/ m.coeffRef(i,j)
(加m[i]
和m.x(),...
来获取特殊向量情况)。
现在,'m(i,j)'变体 范围检查,除非定义了NDEBUG
或EIGEN_NO_DEBUG
宏。通常,前一个宏是为“发布”版本定义的,因此在这种情况下不会执行范围检查。基本原理是Eigen是一个面向性能的库,检查有成本,因此只有调试才有意义。
永远不会检查m.coeff(i,j)
表单。
如果没有执行检查,任何调用系数访问器超出范围的尝试都是违反前提条件的,这意味着行为未定义。
一般来说,你应该最小化索引访问的使用,以支持更高级别的块/线性代数操作(Eigen有很多);你的代码将变得更紧凑,更易读(至少,对于代数感知的读者),更正确(更少范围访问的风险)和(可能更多)更快。