2015-12-03 53 views
0

R矩陣我有以下R代碼獲得從QR對象

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

其中P被給定爲輸入。

我試圖用徵來寫同樣的代碼在C++

​​

但問題是,矩陣是不同的(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 
+0

你測試什麼矩陣? – harre

+0

@harre我可以在哪裏發佈矩陣?它很大。 – Nick

+2

你能用一個小矩陣來證明這個問題嗎? –

回答

1

在本徵的版本,您使用的是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; 
+0

通過使用'colPivHouseholderQr',我得到以下對角線'-370.247 -1.37452 1 0 0'。你有什麼想法爲什麼結果如此不同?輸入矩陣「P」幾乎是相同的(差異僅在小數點後三位出現)。 – Nick

+0

矩陣等級是否有缺陷? – harre

+0

@harre我怎麼知道矩陣秩是否有缺陷? – Nick