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

Спасибо!


person Tim    schedule 20.11.2010    source источник
comment
Общий совет: не давайте объектам (например, матрицам) имя, которое уже используется (здесь c).   -  person Qaswed    schedule 10.12.2016


Ответы (3)


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

R выполняет поэлементное умножение, когда вы вызываете solve(c) * c.

person Community    schedule 20.11.2010

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

person doug    schedule 20.11.2010
comment
@xeon не уверен, как ты мог это пропустить — см. 60 Руководства по пакету, упомянутому в моем ответе выше - person doug; 06.06.2014
comment
Спасибо за ваш ответ. Я получил эту ошибку при запуске функции fem() из пакета FisherEM. Запуск Mavericks Mac OS X. - person Vladislavs Dovgalecs; 06.06.2014
comment
очень важно отметить ответ @mathias_Schmidtblaicher о неточности ginv для почти сингулярных матриц и недостаточной скорости для больших матриц - person WetlabStudent; 05.02.2021

Обратите внимание, что если вам важна скорость и вам не нужно беспокоиться об особенностях, 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 
person Matthias Schmidtblaicher    schedule 27.02.2016
comment
+1: я только что использовал решение, чтобы инвертировать почти сингулярную матрицу (номер условия 10 ^ 15), это дало ответ, отличный от ginv. Проверка XX^-1 показала, чтоsolve работает хорошо, в то время как ginv производит мусор. - person WetlabStudent; 05.02.2021