R中的QR分解 - 强迫正对角线

时间:2016-04-15 02:34:44

标签: r qr-code

我对R中的qr函数有一个问题。我的输入矩阵是正定的,所以R应该给r函数一个三角矩阵,对角线都是正的。但是,我发现对角线上有一些负值。我该如何解决这个问题?

假设我们有一个矩阵y,如下所示:

[1,] 0.07018171 -0.07249188 -0.01952050 
[2,] -0.09617788 0.52664014 -0.02930578 
[3,] -0.01962719 -0.09521439 0.81718699 

这是肯定的:

> eigen(y)$values
[1] 0.82631283 0.53350907 0.05418694

我在R中应用qr(),它给了我 Q =

          [,1]      [,2]        [,3] 
[1,] -0.5816076 -0.6157887 0.5315420 
[2,] 0.7970423 -0.5620336 0.2210021 
[3,] 0.1626538 0.5521980 0.8176926

和R =

[1,] -0.1206685 0.4464293 0.1209139    
[2,] 0.0000000 -0.3039269 0.4797403    
[3,] 0.0000000 0.0000000 0.6513551 

,对角线不是正面的。

非常感谢。

这是矩阵:

structure(c(0.07018171, -0.09617788, -0.01962719, -0.07249188, 
0.52664014, -0.09521439, -0.0195205, -0.02930578, 0.81718699), .Dim = c(3L, 
3L))

2 个答案:

答案 0 :(得分:2)

我可以简单地将对角矩阵与符号(R)相乘以强制对角线条目为正,然后调整Q的相应值.Q然后仍然是正交矩阵。

示例代码

qr.decom <- qr(A)  
Q <- qr.Q(qr.decom)
R <- qr.R(qr.decom)
sgn <- sign(diag(R))
R.new <- diag(sgn) %*% R
Q.new <- Q %*% diag(sgn)

然后R.new有一个正对角线元素。

我们可以使用问题部分中的示例在R中尝试。

答案 1 :(得分:0)

我认为你也可以使用pracma::gramSchmidt。此函数自动返回带有对角线上的正数的gram-schmidt分解。希望它有所帮助。