c++ - 避免矩阵复制构造函数

标签 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>
}

我认为上面的代码在 matrixU 的构造过程中创建了 svd.matrixU()svd.matrixV() 的拷贝>矩阵V。这是真的吗?有什么方法可以避免吗?

谢谢!

最佳答案

在构造matrixUmatrixV 期间不会创建临时拷贝。 Eigen::JacobiSVD继承自Eigen::SVDBase,定义了成员函数matrixU()matrixV() 它只是返回一个 referenceEigen::SVDBase 的 protected 成员变量,该成员变量保存实际矩阵。

但是,你仍然在复制数据,但是显式地:你将局部变量svd中的两个矩阵复制到Foo的成员变量中。如果您不需要就地修改 U 和 V 矩阵,您可以将整个 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
}

很遗憾,您不能修改svd 的成员变量。因此,如果您确实需要修改它们,而不需要原始值,那么您的代码就可以了。

关于c++ - 避免矩阵复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58866557/

相关文章:

c++ - 如何使用 tpl 序列化 "std::string"

c++ - sfml 从另一个类中抽取

r - 所选索引上每行的平均值

Java - ArrayList<Integer>[][] 可能吗?

c++ - vector 元素类型的 Eigen 稀疏矩阵CoeffRef的误差

c++ - 底层集合的抽象迭代器

c++ - 使用 std::istream_iterator 从文件中读取二进制数据过早停止

c - 为什么将数组分配给矩阵是非法的?

c++ - 具有不同返回类型的 Eigen 系数明智运算符

c++ - 如何根据模板参数控制内存分配?