3

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

4

2 回答 2

3

Newmat完全符合您的要求。

要将 A 分解为 QR,您可以执行以下操作:

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

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

于 2012-03-08T20:50:56.693 回答
1

尽管这个问题有点老了,但记录一下: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';
}
于 2017-10-12T21:43:16.040 回答