2017-08-16 7 views
1

Je question très simple mais je ne peux malheureusement pas trouver réponse dans la documentation EigenEigen: inversion de la matrice rectangulaire (moins solution de norme)

J'ai une matrice « gras » A (nombre de lignes est inférieur au nombre de cols) et je veux trouver le moins de pseudo-norme de cette matrice.

Idéalement, je veux le trouver via moins la norme QR décomposition comme spécifié dans this diapositives.

diapositives Selon je peux utiliser l'approche simple pour le faire en utilisant cette formule

A.transpose() * (A * A.transpose()).inverse() 

Mais j'espère qu'il ya une solution plus élégante dans Eigen

PS Désolé pour mon anglais

+0

Avez-vous besoin l'inverse réelle (pseudo), ou voulez-vous juste résoudre des équations? – chtz

+0

@chtz j'ai besoin inverse. Les composants de cette matrice seront utilisés plus loin dans le problème des grands moindres carrés. –

Répondre

2

Si A est le rang complet alors votre formule est correcte et vous pouvez également l'obtenir à partir de la décomposition HouseholderQR de A.transpose():

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); 

Sinon, vous devrez utiliser Eigen::CompleteOrthogonalDecomposition qui est beaucoup plus simple à utiliser car il est le but principal est de résoudre les problèmes de normes minimales:

CompleteOrthogonalDecomposition<MatrixXd> cqr(A); 
pinv = cqr.pseudoInverse();