Тонкое QR-разложение в с ++ - PullRequest
3 голосов
/ 01 ноября 2011

Существует ли простая в использовании библиотека c ++ для "тонкого" QR-разложения прямоугольной матрицы?
Кажется, что Eigen поддерживает только полные матрицы Q. Я могу взять полный Q и отбросить некоторые столбцы, но будет ли эффективнее не вычислять их для начала?

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Newmat делает именно то, что вы хотите.

Чтобы разложить A на QR, вы можете сделать:

Matrix Q = A;
UpperTriangularMatrix R;
QRZ(Q, R)

Если A - матрица 3x5, R будетбудет 3x3 и Q также будет 3x5.

1 голос
/ 13 октября 2017

Несмотря на то, что этот вопрос немного устарел, для записи: Эйген не явно вычисляет матрицу Q, а представляет собой последовательность векторов Домехолдера, которую можно непосредственно умножить на любую матрицу (с правильным числом строк).

Если вы на самом деле явно хотите получить тонкую матрицу Q, просто умножьте ее на единичную матрицу желаемого размера:

#include <Eigen/QR>
#include <iostream>

int main()
{
    using namespace Eigen;
    MatrixXf A(MatrixXf::Random(5,3));
    HouseholderQR<MatrixXf> qr(A);
    MatrixXf thinQ = qr.householderQ() * MatrixXf::Identity(5,3);
    std::cout << thinQ << '\n';
}
...