행렬의 역수를 계산하는 데 권장되는 방법이 무엇인지 궁금합니다.
내가 찾은 방법이 만족스럽지 않은 것 같습니다. 예를 들면
> c=rbind(c(1, -1/4), c(-1/4, 1))
> c
[,1] [,2]
[1,] 1.00 -0.25
[2,] -0.25 1.00
> inv(c)
Error: could not find function "inv"
> solve(c)
[,1] [,2]
[1,] 1.0666667 0.2666667
[2,] 0.2666667 1.0666667
> solve(c)*c
[,1] [,2]
[1,] 1.06666667 -0.06666667
[2,] -0.06666667 1.06666667
> qr.solve(c)*c
[,1] [,2]
[1,] 1.06666667 -0.06666667
[2,] -0.06666667 1.06666667
감사!
답변
solve(c)
올바른 역을 제공합니다. 코드의 문제는 행렬 곱셈에 잘못된 연산자를 사용하고 있다는 것입니다. solve(c) %*% c
R에서 행렬 곱셈을 호출 하려면 을 사용해야 합니다.
R은를 호출 할 때 요소 별 곱셈을 수행합니다 solve(c) * c
.
답변
MASS 패키지 에서 ginv () (Moore-Penrose 일반화 역) 함수를 사용할 수 있습니다.
답변
속도에 관심 solve()
이 있고 특이점에 대해 걱정할 필요가없는 경우 ginv()
다음을 확인할 수 있으므로 훨씬 더 빠르기 때문에를 선호해야합니다 .
require(MASS)
mat <- matrix(rnorm(1e6),nrow=1e3,ncol=1e3)
t0 <- proc.time()
inv0 <- ginv(mat)
proc.time() - t0
t1 <- proc.time()
inv1 <- solve(mat)
proc.time() - t1