Обратная матрица в 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

Ответы:

155

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 
Маттиас Шмидтблайхер
источник