Обратная матрица в 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
Спасибо!
Ответы
Ответ 1
solve(c)
дает правильный обратный. Проблема с вашим кодом заключается в том, что вы используете неправильный оператор для умножения матрицы. Вы должны использовать solve(c) %*% c
для вызова умножения матрицы в R.
R выполняет умножение элементов по элементу при вызове solve(c) * c
.
Ответ 2
Вы можете использовать функцию ginv() (обобщенный инверс Мура-Пенроуза) в пакете МАСС
Ответ 3
Обратите внимание: если вам нужна скорость и вам не нужно беспокоиться об особенностях, 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
Ответ 4
В матричной нотации она имеет большое значение оператор "*
" и оператор "%*%
". Первый элемент умножения по элементу, второй - правильная формула для матричного умножения.
Что вам должно было сделать:
c = rbind(c(1, -1/4), c(-1/4, 1))
solve(c) %*% c