c++中的薄QR分解

Thin QR decomposition in c++

本文关键字:QR 分解 c++      更新时间:2023-10-16

是否有一个易于使用的c++库用于矩形矩阵的"thin" QR分解?
Eigen似乎只支持满Q矩阵。我可以取一个完整的Q并丢弃一些列,但如果一开始就不计算它们会更有效率吗?

Newmat完全符合您的要求。

将A分解为QR,可以这样做:

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

如果A是3x5矩阵,则R是3x3, Q也是3x5

尽管这个问题有点老了,但要记录:Eigen并没有显式地计算Q矩阵,而是一个Householder向量序列,它可以直接与任何矩阵(具有正确的行数)相乘。

如果你确实明确地想要薄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';
}