c++ 中的细 QR 分解

发布于 2024-12-13 07:16:03 字数 99 浏览 2 评论 0原文

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

Is there an easy to use c++ library for "thin" QR decomposition of a rectangular matrix?
Eigen seems to only support full Q matrices. I can take a full Q and discard some columns, but would it be more efficient to not compute them to begin with?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

时光病人 2024-12-20 07:16:03

Newmat 正是您想要的。

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

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

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

Newmat does exactly what you want.

To decompose A into QR, you can do:

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

If A is a 3x5 matrix, R will be 3x3 and Q will be 3x5 as well.

时常饿 2024-12-20 07:16:03

尽管这个问题有点老了,但郑重声明: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';
}

Even though this question is a bit old, for the record: Eigen does not explicitly compute the Q matrix, but a sequence of Householder vectors, which can directly be multiplied with any matrix (with the correct number of rows).

If you actually explicitly want the thin Q matrix, just multiply by an identity-matrix of the desired size:

#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';
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文