如何通过 Eigen C++ 重用矩阵 A 的 SVD 来解决 A 及其转置的 LS 问题?

计算科学 C++ 最小二乘 svd 本征 密集矩阵
2021-12-17 12:49:32

如果ARm×n,bRm,cRn,

如果我需要通过 SVD 解决最小二乘问题AAT, IE

我需要通过 SVD 解决以下线性系统的最小二乘解:

Ax=bi,i=1,2,3,

ATy=cj,j=1,2,3,

也可以通过householderQr().solve()Eigen 来实现,但不稳定;所以我想通过SVD分解来做到这一点AAT; 显然,SVDAT可以通过转置得到A.

我的问题是,我怎样才能在 Eigen 中实现它,以便只有 SVDA 可以解决这两种类型的最小二乘问题吗?

int m=100,n=50;
VectorXd b=VectorXd::randome(m),c=VectorXd::randome(n);
MatrixXd A=MatrixXd::random(m,n);
Eigen::JacobiSVD<Eigen::MatrixXd> _svd(A, Eigen::ComputeThinU | Eigen::ComputeThinV);   
MatrixXd  x = _svd.solve(b);

A.transposeInPlace();

// 如何保存下面这句话,它实现了 SVDAT

Eigen::JacobiSVD<Eigen::MatrixXd> _svd(A, Eigen::ComputeThinU | Eigen::ComputeThinV);

MatrixXd  y = _svd.solve(c);
1个回答

我没有太多使用 eigen 的经验,但是当您使用 SVD 分解求解系统时,实际上您正在执行以下操作:

Ax=USVTx=b

并且您使用 A 的 SVD 分解来隔离x

x=VS1UTb.

其他系统也一样:

ATy=VSUTy=c

并且您使用 A 的 SVD 分解来隔离x

y=US1VTc.

因此,使用 eigen 您应该能够恢复指向矩阵的指针U,SV作为类似的东西

MatrixUType* U        = _svd.matrixU()
MatrixVType* V        = _svd.matrixV()
SingularValuesType* S = _svd.singularValues()

然后使用库中的一些函数将操作应用于c(矩阵乘法、转置乘法和对角线求逆)以获得y.

很抱歉我不能给你更多的实现细节,但它认为它可以提供帮助。