R中matrix的逆
我想知道什么是你推荐的方法来计算matrix的逆?
我发现的方式似乎并不令人满意。 例如,
> 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
谢谢!
solve(c)
确实给出了正确的逆。 你的代码的问题是你正在使用错误的运算符进行matrix乘法。 您应该使用solve(c) %*% c
来调用R中的matrix乘法。
R调用solve(c) * c
时,R逐个执行元素乘法。
您可以在MASS包中使用函数ginv() (Moore-Penrose广义逆)
请注意,如果您关心速度而不需要担心奇点,那么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
在matrix符号中,它对运算符“ *
”和运算符“ %*%
”有很大的影响。 第一个元素是乘法元素,第二个是matrix乘法的正确公式。 侯应该做的是:
c = rbind(c(1, -1/4), c(-1/4, 1)) solve(c) %*% c