Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 参考特征矩阵_C++_Eigen_Eigen3 - Fatal编程技术网

C++ 参考特征矩阵

C++ 参考特征矩阵,c++,eigen,eigen3,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:

我希望当我创建一个特征矩阵并将其设置为另一个矩阵时,我会看到引用语义。具体地说,我期望这篇文章的输出

#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: 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;
}
所以问题是。。。为什么Eigen似乎在复制矩阵而不是引用它们

另外,最后我想定义一个矩阵,例如上面示例中的a,然后创建Holder类的多个实例,其中每个实例都引用同一个矩阵。具体地说,我想要修改A修改Holder类中的矩阵的行为。问题是我不能修改Holder类本身。例如,我无法更改Holder类来保存指向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 &)
A: 4 0
C: 1 0
MatrixXd A = MatrixXd::Identity(1, 2); // this is an object
MatrixXd& B = A; // this is a reference to an object (notice the &)