Zastanawiałem się, jaki jest twój zalecany sposób obliczenia odwrotności macierzy?
Sposoby, które znalazłem, wydają się niezadowalające. Na przykład,
> 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
Dzięki!
r
matrix-inverse
Tim
źródło
źródło
c
).Odpowiedzi:
solve(c)
daje poprawną odwrotność. Problem z twoim kodem polega na tym, że używasz niewłaściwego operatora do mnożenia macierzy. Powinieneś użyćsolve(c) %*% c
do wywołania mnożenia macierzy w R.R wykonuje mnożenie element po elemencie podczas wywoływania
solve(c) * c
.źródło
Możesz użyć funkcji ginv () (uogólniona odwrotność Moore-Penrose'a) w pakiecie MASS
źródło
Zauważ, że jeśli zależy Ci na szybkości i nie musisz martwić się o osobliwości,
solve()
powinien być preferowany,ginv()
ponieważ jest znacznie szybszy, co możesz sprawdzić: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
źródło