Обернена матриця в 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).
Касвід

Відповіді:


153

solve(c)дає правильний зворотний. Проблема вашого коду полягає в тому, що ви використовуєте неправильний оператор для множення матриць. Вам слід використовувати, solve(c) %*% cщоб викликати множення матриць у R.

R виконує множення за елементами, коли ви викликаєте solve(c) * c.


22

Ви можете використовувати функцію ginv () (узагальнена інверсія Мура-Пенроуза) у пакеті MASS


@xeon не знає, як можна це пропустити - див. стор. 60 Посібника з упаковки, про який йдеться у моїй відповіді вище
doug

Спасибі за вашу відповідь. Я отримав цю помилку під час запуску функції fem () із пакета FisherEM. Запуск Mavericks Mac OS X.
Владиславс Довгалець

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 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.