R에서 행렬의 역


90

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

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

> 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  

감사!


9
일반적인 조언 : 객체 (예 : 행렬)에 이미 사용 된 이름 (여기 c)을 지정하지 마십시오 .
Qaswed

답변:


154

solve(c)올바른 역을 제공합니다. 코드의 문제는 행렬 곱셈에 잘못된 연산자를 사용하고 있다는 것입니다. solve(c) %*% cR에서 행렬 곱셈을 호출 하려면 을 사용해야 합니다.

R은를 호출 할 때 요소 별 곱셈을 수행합니다 solve(c) * c.


22

MASS 패키지 에서 ginv () (Moore-Penrose 일반화 역) 함수를 사용할 수 있습니다.


@xeon은 어떻게 놓칠 수 있는지 확실하지 않습니다. 위의 답변에 언급 된 패키지 설명서 60 장
doug

답변 주셔서 감사합니다. FisherEM 패키지에서 fem () 함수를 실행할 때이 오류가 발생했습니다. Mavericks Mac OS X 실행
Vladislavs Dovgalecs 2014-06-06

9

속도에 관심 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 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.