Eigen:反转矩形矩阵(最小范数解)
Eigen: inverting rectangular matrix (least norm solution)
我有一个非常简单的问题,但不幸的是我在 Eigen 文档中找不到答案
我有一个"fat"矩阵A(行数小于列数)我想找到这个矩阵的最小范数伪逆。
理想情况下,我想通过 this 幻灯片中指定的最小范数 QR 分解找到它。
根据幻灯片,我可以使用这个公式
A.transpose() * (A * A.transpose()).inverse()
但我希望Eigen中有更优雅的解决方案
PS对不起我的英语
如果A是满秩那么你的公式是正确的,你也可以从A.transpose()
的HouseholderQR
分解得到:
MatrixXd A(3,6);
A.setRandom();
HouseholderQR<MatrixXd> qr(A.transpose());
MatrixXd pinv;
pinv.setIdentity(A.cols(), A.rows());
pinv = qr.householderQ() * pinv;
pinv = qr.matrixQR().topLeftCorner(A.rows(),A.rows()).triangularView<Upper>().transpose().solve<OnTheRight>(pinv);
如果没有,那么您将不得不使用 Eigen::CompleteOrthogonalDecomposition,因为它的主要目的是解决最小范数问题,所以使用起来更简单:
CompleteOrthogonalDecomposition<MatrixXd> cqr(A);
pinv = cqr.pseudoInverse();
我有一个非常简单的问题,但不幸的是我在 Eigen 文档中找不到答案
我有一个"fat"矩阵A(行数小于列数)我想找到这个矩阵的最小范数伪逆。
理想情况下,我想通过 this 幻灯片中指定的最小范数 QR 分解找到它。
根据幻灯片,我可以使用这个公式
A.transpose() * (A * A.transpose()).inverse()
但我希望Eigen中有更优雅的解决方案
PS对不起我的英语
如果A是满秩那么你的公式是正确的,你也可以从A.transpose()
的HouseholderQR
分解得到:
MatrixXd A(3,6);
A.setRandom();
HouseholderQR<MatrixXd> qr(A.transpose());
MatrixXd pinv;
pinv.setIdentity(A.cols(), A.rows());
pinv = qr.householderQ() * pinv;
pinv = qr.matrixQR().topLeftCorner(A.rows(),A.rows()).triangularView<Upper>().transpose().solve<OnTheRight>(pinv);
如果没有,那么您将不得不使用 Eigen::CompleteOrthogonalDecomposition,因为它的主要目的是解决最小范数问题,所以使用起来更简单:
CompleteOrthogonalDecomposition<MatrixXd> cqr(A);
pinv = cqr.pseudoInverse();