C++ 正确访问特征矩阵的一行
从in-Eigen看来,它不是C++ 正确访问特征矩阵的一行,c++,matrix,c++14,constants,eigen,C++,Matrix,C++14,Constants,Eigen,从in-Eigen看来,它不是const,因此您无法在const引用上调用此函数,例如const矩阵&xx.row(i)是不允许的 如果我需要一个const方法来获取 x的第i行 您知道为什么行()函数不常量的原因吗 typedef特征::矩阵; void func(常数矩阵和x){ //什么东西 x、 行(i);//错误:对常量对象调用了非常量函数行 //什么东西 } 免责声明:我的问题很明显,对于一个经验丰富的Eigendev,可能需要2秒钟的时间,对此陈词滥调表示歉意。如果你确信答案是显
const
,因此您无法在const引用上调用此函数,例如const矩阵&x
x.row(i)代码>是不允许的
如果我需要一个const方法来获取
x的第i行
您知道为什么行()函数不常量的原因吗
typedef特征::矩阵;
void func(常数矩阵和x){
//什么东西
x、 行(i);//错误:对常量对象调用了非常量函数行
//什么东西
}
免责声明:我的问题很明显,对于一个经验丰富的Eigen
dev,可能需要2秒钟的时间,对此陈词滥调表示歉意。如果你确信答案是显而易见的,请随意关闭帖子。我尝试了C++聊天,而没有人知道答案。 < P>你必须使用一个过时的本征版本。下面的代码使用Eigen 3.3编译得很好
#include <Eigen/Core>
typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> Matrix;
void func(const Matrix& x) {
x.row(0);
}
int main() {
Matrix m = Matrix::Random(2,2);
func(m);
}
#包括
typedef特征::矩阵;
void func(常数矩阵和x){
x、 第(0)行;
}
int main(){
矩阵m=矩阵::随机(2,2);
func(m);
}
顺便说一句,在任何情况下都不要这样做
void func(const Matrix& x) {
const_cast<Matrix&>(x).whatever();
}
void func(常数矩阵&x){
const_cast(x.whatever();
}
这将调用未定义的行为!存在const_cast的唯一原因是与可能不存在const正确性的遗留C接口兼容。永远不要放弃constness来调用const对象的const成员函数。您可以像const_cast(x).row(i)那样做根据我的经验,Eigen不太关心常量的正确性。只需对矩阵进行非常量引用,即使您不打算修改它们。或者扔掉康斯特内斯,但这并不能让东西变得更漂亮。@CrisLuengo谢谢你的评论!听到你对Eigen质量的评论我很难过。可能是常数是由一些tempalte参数推断或其他什么添加的,我在Eigen中看到了Ref类,这在这里可能有用。如果原始对象不是常数,而引用是常数,那么这就不是问题了。实际上,row()似乎有一个常数版本而且它总是编译成行的常量版本,因为行始终存在。@ggael据此进行了编辑。
void func(const Matrix& x) {
const_cast<Matrix&>(x).whatever();
}