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