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


спасибо!

1892   4  

4 ответов:

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

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

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

обратите внимание, что если вы заботитесь о скорости и не нужно беспокоиться о сингулярности, 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 

в матричном обозначении это имеет большое значение оператор"*" и оператора "%*%". Первый делает умножение элемент на элемент, второй является правильной формулой для умножения матрицы. Что Хоу должен был сделать это:

c = rbind(c(1, -1/4), c(-1/4, 1))

solve(c) %*% c

Comments

    Ничего не найдено.