我有这样的情况:
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
谢谢!
最佳答案
在构造matrixU
和matrixV
期间不会创建临时拷贝。 Eigen::JacobiSVD
继承自Eigen::SVDBase
,定义了成员函数matrixU()
和matrixV()
它只是返回一个 reference 到 Eigen::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/