[r] R에서 행렬의 역

행렬의 역수를 계산하는 데 권장되는 방법이 무엇인지 궁금합니다.

내가 찾은 방법이 만족스럽지 않은 것 같습니다. 예를 들면

> 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) %*% cR에서 행렬 곱셈을 호출 하려면 을 사용해야 합니다.

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


답변