简体   繁体   中英

QR decomposition in R - Forcing a Positive Diagonal

I have a problem about qr function in R. My input matrix is positive definite, so R should be give r function a triangular matrix with diagonal are all positive. However, I found there are some negative values in the diagonal. How can I address this problem?

Suppose we have a matrix y looks like this:

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

It is positive-definite:

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

I apply qr() in R, it gave me 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

and R =

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

which the diagonal is not positive.

Many thanks.

Here is the matrix:

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

I can simply multiply a diagonal matrix with sign(R) to force the diagonal entries to be positive and then adjust corresponding value of Q. Q then still an orthogonal matrix.

Sample code

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)

Then R.new has a positive diagonal elements.

We could use example in the question part to try it in R.

I think you can also use pracma::gramSchmidt . This function returns automatically a gram-schmidt decomposition with positives on the diagonale. Hope it helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM