C++ 本征函数的正确指数化

C++ 本征函数的正确指数化,c++,eigen,C++,Eigen,假设我在Eigen中有一个矩阵a。当我编写以下代码时: cout << "Number of Columns of A is: "<< A.cols() << endl; cout << "Number of Rows of A is: "<< A.rows() << endl; 根据以上结果,我希望当我编写以下代码时,我会得到异常错误,但这不会发生,它会打印一个值!!!为什么 cout << A(500,14

假设我在
Eigen
中有一个
矩阵a
。当我编写以下代码时:

cout << "Number of Columns of A is: "<< A.cols() << endl;
cout << "Number of Rows of A is: "<< A.rows() << endl;
根据以上结果,我希望当我编写以下代码时,我会得到
异常错误
,但这不会发生,它会打印一个值!!!为什么

cout << A(500,140);

cout如本征文件所述,矩阵系数可以通过
m(i,j)
m.coeff(i,j)
/
m.coefref(i,j)
(对于特殊向量情况,加上
m[i]
m.x(),…

现在,除非定义了
NDEBUG
EIGEN\u NO\u DEBUG
宏,否则将对“m(i,j)”变量进行范围检查。通常,前一个宏是为“发布”版本定义的,因此在这种情况下不会执行范围检查。其基本原理是,Eigen是一个面向性能的库,检查是有成本的,因此启用它们仅用于调试目的是有意义的

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

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


一般来说,您应该尽量减少索引访问的使用,以支持更高级别的块/线性代数运算(Eigen有很多);您的代码将更加紧凑、可读性更强(至少对代数读者来说是这样)、更加正确(越界访问的风险更小)和更快。

如本征文档中所述,矩阵系数可以通过
m(i,j)
m.coeff(i,j)
/
m.coefref(i,j)
m.coefref(i,j)
(加上
m[i]
m.x(),…
用于特殊向量情况)

现在,除非定义了
NDEBUG
EIGEN\u NO\u DEBUG
宏,否则将对“m(i,j)”变量进行范围检查。通常,前一个宏是为“发布”版本定义的,因此在这种情况下不会执行范围检查。其基本原理是,Eigen是一个面向性能的库,检查是有成本的,因此启用它们仅用于调试目的是有意义的

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

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


一般来说,您应该尽量减少索引访问的使用,以支持更高级别的块/线性代数运算(Eigen有很多);您的代码将更紧凑、可读性更强(至少对于一个了解代数的读者来说是这样)、更正确(越界访问的风险更小)和更快(可能更快)。

这似乎是一种未定义的行为:发生的事情没有定义,所以您的软件可能会崩溃、显示值、,或者其他任何东西它似乎是一个未定义的行为:发生的事情没有定义,所以你的软件可以崩溃,显示值,或者其他任何东西。是的,你说得对。我处于
release
模式。那么为什么我在写
cout@Saeid时会给出一个简短的答案:未定义的行为意味着未定义的行为;任何事情都可能发生,包括出于任何原因的例外。如果你想知道你的(非法)代码抛出的确切原因,你需要生成一个调试器并使用调试器来查看发生了什么…Thanx guy。是的,你说得对。我处于
release
模式。那么为什么我在写
cout@Saeid时会给出一个简短的答案:未定义的行为意味着未定义的行为;任何事情都可能发生,包括出于任何原因的例外。如果您想知道(非法)代码抛出的确切原因,您需要生成一个函数并使用调试器来查看发生了什么。。。
cout << A(500,140);