Собственный : инвертирующая прямоугольная матрица (решение по наименьшей норме)

У меня очень простой вопрос, но, к сожалению, я не могу найти ответ в документации Eigen.

У меня есть «толстая» матрица A (количество строк меньше количества столбцов), и я хочу найти псевдоинверсию этой матрицы с наименьшей нормой.

В идеале я хочу найти его с помощью разложения QR по наименьшей норме, как указано в этого слайда.

Согласно слайдам, я могу использовать прямой подход, чтобы сделать это, используя эту формулу

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

Но я надеюсь, что в Эйгене есть более элегантное решение.

PS Извините за мой английский


person Dark_Daiver    schedule 16.08.2017    source источник
comment
Вам нужна фактическая (псевдо) обратная, или вы просто хотите решить уравнения?   -  person chtz    schedule 16.08.2017
comment
@chtz мне нужно обратное. Компоненты этой матрицы будут использоваться в дальнейшем в большой задаче наименьших квадратов.   -  person Dark_Daiver    schedule 16.08.2017


Ответы (1)


Если A имеет полный ранг, то ваша формула верна, и вы также можете получить ее из HouseholderQR разложения 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);

Если нет, то вам придется использовать Eigen::CompleteOrthogonalDecomposition, который намного проще. использовать, потому что его основная цель - решить проблемы с минимальной нормой:

CompleteOrthogonalDecomposition<MatrixXd> cqr(A);
pinv = cqr.pseudoInverse();
person ggael    schedule 16.08.2017