コレスキー分解を使用して、正の半正定行列の逆行列を計算しています。ただし、行列が非常に大きくなり、ゼロが含まれている場合、行列は (コンピューターの観点から数値的に) 正定値ではなくなります。この問題を回避するために、私は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()
。