引用自己的矩阵
Referencing Eigen Matrices
我希望当我创建一个特征矩阵并将其设置为等于另一个矩阵时,我会看到引用语义。具体来说,我期望这个
的输出
#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 正在为这些构造函数使用复制语义。但是如果我明确引用输入(比如在 class 构造函数中),我似乎仍然在获取复制语义。具体来说,
的输出
#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
class 的许多实例,其中每个实例具有对同一矩阵的引用。具体来说,我想要修改 A
修改 Holder
classes 中的矩阵的行为。问题是我不能修改 Holder
class 本身。因此,例如,我无法更改 Holder
class 以保存指向 A
的指针而不是 A
本身。我将如何做到这一点?
我已经搜索了 Eigen 文档,但似乎找不到解释。
Eigen 正在复制,因为您要求它复制。如果你想引用一个矩阵,你必须使用正确的语法来指定它。在 C++ 中,引用变量用 &
字符指定:
MatrixXd A = MatrixXd::Identity(1, 2); // this is an object
MatrixXd& B = A; // this is a reference to an object (notice the &)
我希望当我创建一个特征矩阵并将其设置为等于另一个矩阵时,我会看到引用语义。具体来说,我期望这个
的输出#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 正在为这些构造函数使用复制语义。但是如果我明确引用输入(比如在 class 构造函数中),我似乎仍然在获取复制语义。具体来说,
的输出#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
class 的许多实例,其中每个实例具有对同一矩阵的引用。具体来说,我想要修改 A
修改 Holder
classes 中的矩阵的行为。问题是我不能修改 Holder
class 本身。因此,例如,我无法更改 Holder
class 以保存指向 A
的指针而不是 A
本身。我将如何做到这一点?
我已经搜索了 Eigen 文档,但似乎找不到解释。
Eigen 正在复制,因为您要求它复制。如果你想引用一个矩阵,你必须使用正确的语法来指定它。在 C++ 中,引用变量用 &
字符指定:
MatrixXd A = MatrixXd::Identity(1, 2); // this is an object
MatrixXd& B = A; // this is a reference to an object (notice the &)