避免Matrix复制构造函数

时间:2019-11-14 21:10:10

标签: c++ matrix eigen

我遇到这样的情况:

using JacobiSVD = Eigen::JacobiSVD<MatrixXcd, Eigen::FullPivHouseholderQRPreconditioner>;

class Foo {
    public:
        MatrixXcd matrixU;
        MatrixXcd matrixV;

        Foo(const Ref<const MatrixXcd>& mat);
}

Foo::Foo(const Ref<const MatrixXcd>& mat) {
    JacobiSVD svd(mat, Eigen::ComputeFullU | Eigen::ComputeFullV);
    matrixU = svd.matrixU();
    matrixV = svd.matrixV();

    // <proceed to mutate computeU and computeV>
}

我认为以上内容在构造svd.matrixU()svd.matrixV()时创建了matrixUmatrixV的副本。这是真的吗,有什么办法可以避免?

谢谢!

1 个答案:

答案 0 :(得分:4)

在构造matrixUmatrixV时不会创建任何临时副本。 Eigen::JacobiSVD继承自Eigen::SVDBase,后者定义了成员函数matrixU()matrixV(),它们只是向受{{1 }},其中包含实际矩阵。

但是,您仍在复制数据,但要明确地:将两个矩阵从局部变量Eigen::SVDBase复制到svd的成员变量中。如果不需要就地修改U和V矩阵,则可以将整个Foo存储在svd中,就像这样:

Foo

很遗憾,您无法修改class Foo { public: JacobiSVD svd; Foo(const Ref<const MatrixXcd>& mat); }; Foo::Foo(const Ref<const MatrixXcd>& mat): svd(mat, Eigen::ComputeFullU | Eigen::ComputeFullV) { // proceed to do other things } 的成员变量。因此,如果您确实需要修改它们,并且不需要原始值,那么您的代码就可以了。