引用特征矩阵

时间:2018-01-31 10:41:05

标签: c++ eigen eigen3

我预计当我创建一个特征矩阵并将其设置为等于另一个矩阵时,我会看到参考语义。具体来说,我期待这个

的输出
#include <iostream>
#include "Eigen/Dense"

using Eigen::MatrixXd;
using Eigen::VectorXd;

int main() {

    MatrixXd A = MatrixXd::Identity(1, 2);
    MatrixXd B = A;
    A(0, 0) = 4;
    std::cout << "A: " << A << std::endl;
    std::cout << "B: " << B << std::endl;
    return 0;
}

A: 4 0
B: 4 0

但我实际上得到了

A: 4 0
B: 1 0

所以我猜Eigen正在为这些构造函数使用复制语义。但是,如果我显式引用输入(就像在类构造函数中),我似乎仍然得到复制语义。具体来说,是

的输出
#include <iostream>
#include "Eigen/Dense"

using Eigen::MatrixXd;
using Eigen::VectorXd;

class Holder {

public:
    MatrixXd mat;

    Holder(MatrixXd &A) : mat(A) {
    }
};

int main() {

    MatrixXd A = MatrixXd::Identity(1, 2);
    Holder C(A);
    A(0, 0) = 4;
    std::cout << "A: " << A << std::endl;
    std::cout << "C: " << C.mat << std::endl;
    return 0;
}

A: 4 0
C: 1 0

所以问题是......为什么看起来Eigen正在复制矩阵而不是引用它们?

另外,最后我想定义一个矩阵(例如上面例子中的A),然后创建Holder类的许多实例,其中每个实例都引用一个相同的矩阵。具体来说,我希望修改A的行为修改Holder类中的矩阵。问题是,我无法修改Holder类本身。因此,例如,我无法更改Holder类以保存指向A而非A本身的指针。我怎么做到这一点?

我已经搜过了Eigen文档,但似乎无法找到解释。

1 个答案:

答案 0 :(得分:1)

Eigen正在复制,因为你要求它复制。如果要引用Matrix,则必须使用正确的语法指定它。在C ++中,引用变量使用&字符指定:

MatrixXd A = MatrixXd::Identity(1, 2); // this is an object
MatrixXd& B = A; // this is a reference to an object (notice the &)