3

コレスキー分解を使用して、正の半正定行列の逆行列を計算しています。ただし、行列が非常に大きくなり、ゼロが含まれている場合、行列は (コンピューターの観点から数値的に) 正定値ではなくなります。この問題を回避するために、私はpivot = TRUEの choleski コマンドでオプションを使用しますR。ただし、(以下に示すように) 2 つは同じ出力を返しますが、行と列または行列が再配置されます。それらを同じにする方法(または変換)があるかどうかを調べようとしています。これが私のコードです:

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)
}

実行すると次のようになります。

 > 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

2つの答えを一致させる方法はありますか? inv2()からの回答を返したいinv1()

4

2 に答える 2

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
于 2013-08-22T19:20:08.073 に答える
1

通常

M = matrix(rnorm(9),3)
M
           [,1]        [,2]       [,3]
[1,]  1.2109251 -0.58668426 -0.4311855
[2,] -0.8574944  0.07003322 -0.6112794
[3,]  0.4660271 -0.47364400 -1.6554356
library(Matrix)
pm1 <- as(as.integer(c(2,3,1)), "pMatrix")
M %*% pm1
           [,1]       [,2]        [,3]
[1,] -0.4311855  1.2109251 -0.58668426
[2,] -0.6112794 -0.8574944  0.07003322
[3,] -1.6554356  0.4660271 -0.47364400
于 2013-08-22T18:48:32.927 に答える