从QR对象获取R矩阵

时间:2015-12-03 21:16:00

标签: c++ r matrix eigen

我有以下R代码

P <- matrix(...)
qrP <- qr(t(P))
qR <- qr.R(qrP)

其中P作为输入。

我试图通过使用Eigen:

C++中编写相同的代码
auto qrP = P.transpose().fullPivHouseholderQr();
auto qr = qrP.matrixQR().template triangularView<Upper>();

但问题是矩阵不同(R vs C++)。我是否以错误的方式计算qr矩阵?

这是我打印qR对角线时得到的结果:

diag(qR)
# -1.0000000 -2.1718017 -0.4788378  0.0000000  0.0000000

cout << qr.diagonal();
// -370.247 1.37452 1 -1.5099e-14 -1.16018e-14

1 个答案:

答案 0 :(得分:1)

在Eigen版本中,您使用完全旋转的QR分解,而R调用Lapack的DGEQP3例程,这些例程对应于具有列旋转的QR。在Eigen中,可通过colPivHouseholderQr方法或ColPivHouseholderQR类获得。

此外,您在此处部分滥用auto关键字。请参阅此note。因此,更安全且更接近R的实施将是:

ColPivHouseholderQR<MatrixXd> qrT(T.transpose());
MatrixXd q = qrT.matrixQR().triangularView<Upper>();
std::cout << q.diagonal().transpose() << std::endl;