R中的Choleski分解在pivot = TRUE时获得逆

3 r decomposition matrix-inverse

我正在使用choleski分解来计算半正定矩阵的逆矩阵.然而,当我的矩阵变得非常大并且其中有零时,我得知我的矩阵不再(从计算机的角度来看数字)正定.因此,为了解决这个问题,我使用pivot = TRUE了choleski命令中的选项R.但是,(如下所示)两者返回相同的输出,但行和列或矩阵重新排列.我试图找出是否有一种方法(或转换)使它们相同.这是我的代码:

X = matrix(rnorm(9),nrow=3)
A = X%*%t(X)

inv1 = function(A){
    Q = chol(A)
    L = t(Q)
    inverse = solve(Q)%*%solve(L)
    return(inverse)
}


inv2 = function(A){
    Q = chol(A,pivot=TRUE)
    L = t(Q)
    inverse = solve(Q)%*%solve(L)
    return(inverse)
}
Run Code Online (Sandbox Code Playgroud)

运行时导致:

 > inv1(A)
              [,1]      [,2]      [,3]
    [1,]  9.956119 -8.187262 -4.320911
    [2,] -8.187262  7.469862  3.756087
    [3,] -4.320911  3.756087  3.813175
    > 
    > inv2(A)
              [,1]      [,2]      [,3]
    [1,]  7.469862  3.756087 -8.187262
    [2,]  3.756087  3.813175 -4.320911
    [3,] -8.187262 -4.320911  9.956119
Run Code Online (Sandbox Code Playgroud)

有没有办法让两个答案匹配?我想inv2()从中回答答案inv1().

Vin*_*ynd 5

这解释?chol如下:列置换作为属性返回.

inv2 <- function(A){
  Q <- chol(A,pivot=TRUE)
  Q <- Q[, order(attr(Q,"pivot"))]
  Qi <- solve(Q)
  Qi %*% t(Qi)
}
inv2(A)
solve(A)  # Identical
Run Code Online (Sandbox Code Playgroud)