【问题标题】:Referencing Eigen Matrices引用特征矩阵
【发布时间】:2018-07-10 10:38:01
【问题描述】:

我希望当我创建一个 Eigen 矩阵并将其设置为等于另一个矩阵时,我会看到参考语义。具体来说,我期待这个的输出

#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 文档,但似乎找不到解释。

【问题讨论】:

    标签: c++ eigen eigen3


    【解决方案1】:

    Eigen 正在复制,因为您要求它进行复制。如果你想引用一个矩阵,你必须使用正确的语法来指定它。在 C++ 中,引用变量用 &amp; 字符指定:

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

    【讨论】:

      猜你喜欢
      • 2011-09-29
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 2022-07-10
      • 2022-01-23
      • 2019-04-27
      • 2020-05-12
      • 1970-01-01
      相关资源
      最近更新 更多