正确访问const的一行特征矩阵

时间:2018-01-01 20:10:40

标签: c++ matrix c++14 const eigen

从Eigen的signiture of the row() function看来,它不是multi show-env ( | () where ? $*DEBUG ) { dd %*ENV } multi show-env ( | () where ! $*DEBUG ) { True } 所以你无法在const引用上调用此函数,例如const const Matrix& x是不允许的。

如果我需要const方法来获取,那么最佳做法是什么?    第i行x?

你知道为什么不是x.row(i);函数const?

row()

免责声明:我的问题非常明显,对于经验丰富的typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> Matrix; void func(const Matrix& x) { // Something something x.row(i); // Error: Non-const function row called on const object // Something something } 开发者来说,可能需要2秒钟,请向平庸道歉。如果你确信答案是显而易见的,请随意关闭帖子。我在没有人知道答案的情况下尝试了C ++聊天。

1 个答案:

答案 0 :(得分:1)

你必须使用一个过时的一个破碎的Eigen版本。以下代码与Eigen 3.3编译得很好。

:help virtcol()

顺便说一句,在任何情况下都不会

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

这会调用未定义的行为! void func(const Matrix& x) { const_cast<Matrix&>(x).whatever(); } 存在的唯一原因是与传统的C接口兼容,其中可能不存在const正确性。永远不要抛弃constness来调用const对象的const成员函数。